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.c
和 foo_timer_windows.c
之一被编译并链接到应用程序中。此步骤的详细信息取决于您的构建系统。
我正在创建一个程序,我希望它在 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.c
和 foo_timer_windows.c
之一被编译并链接到应用程序中。此步骤的详细信息取决于您的构建系统。