使用C预处理器确定编译环境

Wad*_*ndy 2 c c++ visual-studio c-preprocessor

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

#ifdef USING_CPLUSPLUS
namespace mynamespace{
#endif

    struct mystruct{
       ...
    };


#ifdef USING_CPLUSPLUS
}
#endif
Run Code Online (Sandbox Code Playgroud)

wkl*_*wkl 8

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

#if defined(__cplusplus)
Run Code Online (Sandbox Code Playgroud)

  • 这是确切的答案,是的.;) (2认同)

RBe*_*eig 6

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

每个编译器都有一组预定义的宏,这些宏偶尔可用于区分编译主机和目标平台.这些宏的一个大型存储库是Predef项目,它们可以尽可能多地收集编译器,主机和目标组合的报告.

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

"所有以下划线开头的标识符以及大写字母或另一个下划线始终保留用于任何用途.",

其他一些条款带有一个部分内容的脚注

"实现定义的关键字应具有为7.1.3中描述的任何用途保留的标识符形式."

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

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

"实现不应预定义宏_ _cplusplus,也不应在任何标准头中定义它."

很难比这更清楚.