我正在创建一个程序,我希望它在 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 行长。有没有一种优雅的方法来解决这个问题?
最佳答案
一个相当普遍的方法是尽可能用标准 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
包含实现foo_timer.h
接口(interface)的特定于 unix 的代码。foo_timer_windows.c
包含实现foo_timer.h
接口(interface)的特定于 Windows 的代码。
编译应用程序时,只有 foo_timer_unix.c
和 foo_timer_windows.c
之一被编译并链接到应用程序中。此步骤的详细信息取决于您的构建系统。
关于C - Windows 和 Unix 上的可移植代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52057036/