【问题标题】:Use of #undef in C++在 C++ 中使用#undef
【发布时间】:2011-08-11 19:49:31
【问题描述】:

我正在研究 GSL 库中的一段代码,但对头文件开头的几行代码感到困惑。 我了解#undef、#ifdef 等的作用,但我不明白的是为什么他们基本上重置了_BE​​GIN_DECLS 的定义,然后再继续定义它?从技术上讲,不应该有任何先前的定义,对吧?我的意思是,这些东西是静态的,不会发生变化。 无论如何,这是代码的摘录:

    #undef __BEGIN_DECLS
    #undef __END_DECLS
    #ifdef __cplusplus
    # define __BEGIN_DECLS extern "C" {
    # define __END_DECLS }
    #else
    # define __BEGIN_DECLS /* empty */
    # define __END_DECLS /* empty */
    #endif

【问题讨论】:

  • 为什么投反对票?对我来说似乎是一个合理的问题。

标签: c++ c-preprocessor preprocessor-directive


【解决方案1】:

除非参数列表和替换列表相同,否则不允许#define 已定义的宏。

如果 __BEGIN_DECLS 先前被定义为替换为 extern "C" { 以外的其他内容,则 #define __BEGIN_DECLS extern "C" { 将无效并且程序将不正确。

从技术上讲,不应该有任何先前的定义,对吧?

当然可以。

【讨论】:

  • 谢谢詹姆斯,有道理。我没有想到其他可能的 _BEGIN_DECLS 定义用于其他目的。
  • 特别是因为带有双下划线的标识符是为实现保留的。
  • 从技术上讲,以前的定义不应该与头文件设置的不同,因为同一个文件不会为一个头文件设置__cplusplus,而为另一个头文件设置#undef
【解决方案2】:

不是真的。如果您正在调用的另一个库使用相同的名称,则该名称已被定义。

因此,由于您无法通过其他定义对其进行定义,因此您首先调用#undef,然后调用#define

有时使用#ifdef#ifndef 是合适的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-05-03
    • 2018-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-21
    • 1970-01-01
    相关资源
    最近更新 更多