1

我想在 Windows 和 Linux 上编译并运行一份 C++ 代码。所以我需要使用条件编译(CC)。但是,在大量的代码文件中如何使用 CC 就遇到了问题。

比如,我有:

//A.cpp
#define _WINDOWS_
#ifdef _WINDOWS_
#include <windows.h>
//some code for windows
#else
#include <pthread.h>
//some code for linux
#endif

我也有B.cpp,C.cpp...

我应该在每个文件中都写“#define _WINDOWS_”,还是有更好的方法?

我试图这样做:

  1. 创建头文件 Platform.h

     #ifndef _PLAT_
     #define _PLAT_
     #define _WINDOWS_
     #endif
    
  2. 包括文件 Platform.h,例如:

     //A.cpp
     #include "Platform.h"
     #ifdef _WINDOWS_
     #include <windows.h>
     //some code for windows
     #else
     #include <pthread.h>
     //some code for linux
     #endif
    
  3. 它编译错误!可能在 include"Platform.h"之前包含<windows.h>会导致错误。

4

2 回答 2

2

使用编译器中的一些预定义宏。

http://sourceforge.net/p/predef/wiki/OperatingSystems/

#ifdef _WIN32
// Code specific to Windows.
#elif defined __linux__ // Many variants; check the link above.
// Code specific to Linux.
#else
// Portable code.
#endif

这在大多数情况下都有效。

请注意,这些宏中的大多数用于检测主机操作系统(即您正在构建程序的系统),而不是目标操作系统(打算运行生成的程序的系统)。但是,通常情况下两个系统都重合。另请注意,这些宏中的任何一个是否实际上是预定义的,显然取决于您的特定编译器。

如果一切都失败了(例如,目标系统与主机不同,或者你的编译器很奇怪,根本没有预定义任何系统检测宏),只需在编译器的命令行中定义它们中的任何一个(例如,-D在 POSIX-兼容的 C 编译器)通过将其放入构建脚本或 makefile 中。不要#define在标题中自己写这样的s。

于 2013-01-08T03:56:53.257 回答
0

您可以在编译期间使用 -D_WINDOWS_。对于 (3) 请注意,标题对排序很敏感。

于 2013-01-08T03:43:54.870 回答