【问题标题】:C++ Platform specific includesC++ 平台特定包括
【发布时间】:2013-05-14 19:14:53
【问题描述】:

我正在开发一个多平台项目。我想要一种简单快捷的方式来管理特定于操作系统的包含,最好不用任何外部工具。

我想要这样的东西(我很清楚这是行不通的)

#define PLATFORM_A 1
#define PLATFORM_B 2

#ifndef TARGET_PLATFORM
//ERROR
#endif

#if TARGET_PLATFORM == PLATFORM_A
    #define DIR "a"
#elif TARGET_PLATFORM == PLATFORM_B
    #define DIR "b"

#define PLATFORM_INCLUDE(file) \
    #include "platforms/" DIR "/" file

【问题讨论】:

  • 如果您的 Makefile(由 configure 命令生成)注入这些常量,那将起作用。例如,如果你在 linux 上,你的 Makefile 将有 gcc -DPLATFORM=windows 等等。然而,问题是你想做什么?例如,Win32 API 程序不会与 Qt 程序分布在同一源代码树中,但如果您尝试使用套接字,您的源文件可能会被 #if 条件语句所覆盖。

标签: c++


【解决方案1】:

我经常看到的一种设置如下:

// platform.h

#if defined PLATFORM_A
    #include "platform_a.h"
#elif defined PLATFORM_B
    #include "platform_b.h"
#else
    // #pragma error or whatever
#endif

然后在必要时#include "platform.h"。

【讨论】:

    【解决方案2】:

    如果不同平台的文件树相同,则可以在源代码中仅指定包含文件的文件名并使用平台相关的包含目录。该目录可以通过环境变量轻松配置。

    【讨论】:

    • 这将是我们当前设置的完美解决方案。为什么我没有想到呢? :P
    【解决方案3】:

    您可以拥有由平台本身定义的预处理器指令。这样你就可以使用:

    #ifndef MAC // MAC performs #define MAC
    
    #ifndef WINDOWS // Windows performs #define WINDOWS
    
    #ifndef UNIX // Unix performs #define UNIX
    
    // ERROR
    
    #endif
    
    #endif
    
    #endif
    

    【讨论】:

      【解决方案4】:

      尝试在字符串之间使用 +。那应该是 C++ 语法。

      比如:

      #define PLATFORM_INCLUDE(file) \
          #include "platforms/" + DIR + "/" file
      

      【讨论】:

      • 这是在预处理器时。并列是如何在这里获得字符串文字连接,而不是 C++ std::string 运算符。
      • 但这行不通,因为它需要多次通过预处理器,还是我完全错了?
      猜你喜欢
      • 2010-11-09
      • 1970-01-01
      • 2016-10-27
      • 2011-06-11
      • 1970-01-01
      • 2018-02-27
      • 1970-01-01
      • 1970-01-01
      • 2019-11-26
      相关资源
      最近更新 更多