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

标签 c windows unix portability

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

关于C - Windows 和 Unix 上的可移植代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52057036/

相关文章:

linux - 在windows/ubuntu上编写node.js raspberrypi程序

windows - 如果运行 node.js 的 Azure 辅助角色终止,是否会重新启动 Node 进程?

linux - 我如何在 Linux 中创建多级软链接(soft link)或者可以这样做吗?

c - 当我为 & records[*Count].source 输入值时,.exe 崩溃

c++ - 如何从 C 或 C++ 调用 .pyc 函数?

windows - 如何使用 PowerShell 获取远程计算机的可用物理内存

linux - Find 无法找到 1M 以下的文件,但可以正常使用 'k' 单位

c - 在 VS 2010 express C++ 程序结束后,我怎样才能使带有输出的控制台不会消失

java - C 内存泄漏与 packetsender 套接字

linux - 尾部-f + grep?