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

时间:2018-08-28 11:44:15

标签: c windows unix portability

我正在创建一个程序,并且希望它在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行。是否有一种优雅的方法来解决这个问题?

1 个答案:

答案 0 :(得分:5)

一种相当普遍的方法是,尽可能使用标准C编写主应用程序,并将所有平台特定的代码放入自定义模块中。

例如,您的主应用程序可以做到

du -t -4K [Path]

完全没有#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来选择特定于平台的typedef和声明,但是主要实现将位于单独的文件中:

  • #ifdef包含实现foo_timer_unix.c接口的特定于Unix的代码。
  • foo_timer.h包含实现foo_timer_windows.c接口的Windows特定代码。

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