【问题标题】:C++ conditional compilation with large numbers of code files具有大量代码文件的 C++ 条件编译
【发布时间】:2012-12-21 21:05:58
【问题描述】:

我想在 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. 编译时出错!可能在包含&lt;windows.h&gt; 之前包含"Platform.h" 会导致错误。

【问题讨论】:

  • 你最好使用_WIN32而不是自己滚动。
  • 我觉得您需要抽象工厂将您的代码分离到不同的平台? en.wikipedia.org/wiki/Abstract_factory_pattern
  • 什么是编译错误?看起来它至少应该可以工作
  • 当我将“WINDOWS”改为“WIN”时,编译成功。使用 _WIN32 对我有用。谢谢大家。

标签: c++ conditional-compilation


【解决方案1】:

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

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 中。不要在标题中自己写这样的#defines。

【讨论】:

  • +1,但通常为不同的平台编译需要一个交叉编译器来定义适当的平台标志。试图通过手动调整来获取另一个平台的代码可能是一场不可能获胜的战斗。
【解决方案2】:

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

【讨论】:

  • -1,这是一种将用户与纠结的构建系统混淆的可靠方法。
  • 是的,这通常取决于许多因素。我在一家拥有极其庞大的代码库的公司工作,这已经流行了十年。这又是一个工程问题,并且有多个实例表明这种方法会很好。在整个用例明确之前,我不会对这种方法一概否定。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-16
  • 1970-01-01
  • 2016-03-10
  • 2014-02-17
  • 1970-01-01
相关资源
最近更新 更多