【问题标题】:Using C Preprocessor to Determine Compilation Environment使用 C 预处理器确定编译环境
【发布时间】:2010-10-04 19:06:55
【问题描述】:

我正在构建一个应用程序,它包含一个用 C 编写的 Windows 驱动程序和一个用 C++ 编写的用户模式可执行文件。它们都使用共享头文件来定义多个宏、常量、枚举等。在 C++ 版本中,我想将所有内容包含在命名空间中,C 编译器不支持此功能。是否有某些变量我可以检查以用作 Visual Studio 的预处理器指令,如下例所示?

#ifdef USING_CPLUSPLUS
namespace mynamespace{
#endif

    struct mystruct{
       ...
    };


#ifdef USING_CPLUSPLUS
}
#endif

【问题讨论】:

  • 在这种情况下,您可能应该只在 mynamespace'). otherwise, mynamespace::mystruct' 中声明 mynamespace_mystruct' as a c struct (then maybe typedef mystruct' 和 `mystruct' 是不同的类型......这只会产生一堆奇怪的条件代码对于使用该界面的人。

标签: c++ c visual-studio c-preprocessor


【解决方案1】:

我能想到的最接近的宏是:

#if defined(__cplusplus)

【讨论】:

  • 那将是确切的答案,是的。 ;)
【解决方案2】:

对于区分 C++ 编译器和 C 编译器的具体示例,明智的选择是宏 __cplusplus,它由 C++ 标准定义存在,并且由于 保留名称规则的副作用 一个在标准 C 中这样说的子句,永远不会被 C 编译器预定义。

每个编译器都有一组预定义的宏,这些宏有时可用于区分编译主机和目标平台。此类宏的一个大型存储库是 Predef Project,他们在其中尽可能多地收集有关编译器、主机和目标组合的报告。

编辑:澄清 C 中 __cplusplus 的保留性质:C 标准始终保留以两个下划线或一个下划线后跟一个大写字母开头的标识符。例如,第 7.1.3 节中的 C99 说

“所有以下划线和大写字母或另一个下划线开头的标识符始终保留供任何使用。”,

和其他几个子句带有一个脚注,部分内容为

“实现定义的关键字应具有标识符的形式,保留用于 7.1.3 中所述的任何用途。”

因此,在没有任何标准的进一步指导的情况下,在 C 编译器的兼容实现中,名称 __cplusplus 保留用于任何用途。该名称是由 C++ 的实现者专门选择的,因为它在 C 中保留,具有明确的含义,并且不知道已由任何 C 实现定义。

但是,通过 C99,标准委员会决定确保没有 C 实现损害可用于区分 C 编译和 C++ 编译的宏的明显实用性。在 C99 第 6.10.8 节中,他们写道:

"实现不得预定义宏_ _cplusplus,也不得定义 在任何标准标题中。”

很难比这更清楚了。

【讨论】:

  • C 标准在哪里声明这样的名称不能是宏?它确实说它保留供实现使用。
  • @potatoswatter,C99 在 6.10.8 中专门识别了它。在寻找关于___ 后跟大写字母的子句之前,我不知道这一点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-17
  • 1970-01-01
  • 2012-03-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多