C - Переносимый код в Windows и Unix - PullRequest
0 голосов
/ 28 августа 2018

Я создаю программу и хочу, чтобы она работала в Windows и UNIX. Однако я использовал много функций, специфичных для Windows или Unix. Например, функции, расположенные в #include<unistd.h> и #include <sys/utsname.h> для UNIX и #include <winsock2.h> и #include <windows.h> для Windows. У меня они работают независимо, но я хочу объединить их.

Вот пример:

struct timespec start, end; // UNIX code
LARGE_INTEGER clockFrequency; // Windows code
QueryPerformanceFrequency(&clockFrequency); 
LARGE_INTEGER startTime; 
LARGE_INTEGER endTime; 
LARGE_INTEGER elapsedTime; 
//...
QueryPerformanceCounter(&startTime); // Windows code
clock_gettime(CLOCK_REALTIME, &start); // UNIX code
CalculateVectorInputs();
QueryPerformanceCounter(&endTime); // Windows code
clock_gettime(CLOCK_REALTIME, &end); // UNIX code

Я хорошо знаю ifdef:

#ifdef _WIN32
// Windows code
#else
#ifdef __unix__
// UNIX code
#endif
#endif

но это кажется очень грязным, чтобы добавлять все в мой код, поскольку моя программа имеет длину около 500 строк. Есть ли элегантный способ подойти к этому?

1 Ответ

0 голосов
/ 28 августа 2018

Довольно распространенный подход - по возможности писать ваше основное приложение в стандарте C и помещать весь специфичный для платформы код в пользовательский модуль.

Например, ваше основное приложение может сделать

#include "foo_timer.h"

...
foo_timer_t start, end;
foo_get_time(&start);
calculate_stuff();
foo_get_time(&end);
foo_time_delta(start, end, &elapsed);

без #ifdef с вообще.

foo_timer.h может использовать #ifdef для выбора специфических для платформы типов определений и объявлений, но основная реализация будет в отдельных файлах:

  • foo_timer_unix.c содержит специфичный для Unix код, который реализует интерфейс foo_timer.h.
  • foo_timer_windows.c содержит специфичный для Windows код, который реализует интерфейс foo_timer.h.

Когда ваше приложение компилируется, только одно из foo_timer_unix.c и foo_timer_windows.c компилируется и связывается с приложением. Детали этого шага зависят от вашей системы сборки.

...