【问题标题】:How to trigger the __cplusplus (C++) #ifdef?如何触发 __cplusplus (C++) #ifdef?
【发布时间】:2011-07-21 16:43:15
【问题描述】:
#ifdef __cplusplus
// C++ code
#else
// C code
#endif

结构是这样的。 我的问题是,如何真正触发#ifdef on?

我的意思是,在程序中?我写什么代码可以开启#ifdef

例如,在这种情况下。 是那个

#define __cplusplus

会开启吗?

【问题讨论】:

  • #ifdef 仅检查是否某些宏定义了,例如 __cplusplus,您可以使用编译器标志(在 gcc 中)使用 -D 或在程序中使用 #define 指令来定义它们
  • @mikhailvs 在这种情况下,您提供的示例均未涵盖此特定情况。编译器本身定义了这个标志,因此用户可以期望它被定义。查看接受的答案。

标签: c++ macros


【解决方案1】:

"#define __cplusplus"

会继续吗?

是的,它会“让它继续”。

__cplusplus 应该由 C++ 编译器自动定义。 C++ 使用不同的name mangling 和经常用于使C 头文件与C++ 兼容的宏:

#ifdef __cplusplus
extern "C" {
#endif

...

#ifdef __cplusplus
}
#endif

【讨论】:

  • 只是为了添加更多信息:我进一步测试了是否使用gcc 编译但同时使用-lstdc++-xc++ 可以使__cplusplus 定义,结果不是。唯一的方法是使用 C++ 编译器。
【解决方案2】:

只需使用 C++ 编译器编译它,__cplusplus 在这种情况下会自动定义。

【讨论】:

    【解决方案3】:

    C++ 标准强制要求__cplusplus 将始终在 C++ 程序中定义。 C标准显然没有。这意味着用户无需费力即可启用此机制。

    【讨论】:

    • 事实上,C 标准强制它被定义。两个委员会之间的一些合作。
    【解决方案4】:

    C++ 编译器会自动定义这一点。

    因为它以两个连续的下划线开头,所以它是保留的。您不允许自己定义它(即,尝试这样做会产生未定义的行为)。

    【讨论】:

    • 我不知道“因为这个开头是两个连续的下划线,所以是保留的。”。谢谢。
    猜你喜欢
    • 2011-04-16
    • 2012-03-18
    • 2021-03-01
    • 1970-01-01
    • 2016-11-22
    • 2010-11-01
    • 1970-01-01
    相关资源
    最近更新 更多