C - Windows 和 Unix 上的可移植代码

C - Portable code on Windows and Unix

我正在创建一个程序,我希望它在 Windows 和 UNIX 上 运行。但是,我使用了很多 Windows 或特定于 Unix 的函数。例如,对于 UNIX,函数位于 #include<unistd.h>#include <sys/utsname.h>,对于 Windows,函数位于 #include <winsock2.h>#include <windows.h>。我让它们独立工作,但我想将它们合并在一起。

这是一个例子:

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 行长。有没有一种优雅的方法来解决这个问题?

一种相当常见的方法是尽可能用标准 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 到 select 平台特定的类型定义和声明,但主要实现将在单独的文件中:

  • foo_timer_unix.c 包含实现 foo_timer.h 接口的特定于 unix 的代码。
  • foo_timer_windows.c 包含实现 foo_timer.h 接口的 windows 特定代码。

编译您的应用程序时,只有 foo_timer_unix.cfoo_timer_windows.c 之一被编译并链接到应用程序中。此步骤的详细信息取决于您的构建系统。