我正在创建一个程序,并且希望它在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行。是否有一种优雅的方法来解决这个问题?
答案 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.h
和foo_timer_unix.c
中只有一个被编译并链接到应用程序中。此步骤的详细信息取决于您的构建系统。