__cplusplus宏告诉g ++关于C头声明的工作并不奇怪

时间:2012-06-12 10:34:13

标签: c++ c g++

我混合使用C C ++代码。全部用g ++编译。无论我在哪里有C头,我都有

中包含的头文件的内容
#if defined(__cplusplus)
extern "C" {
#endif

#if defined(__cplusplus)
    extern "C" {
    #endif

但是在一个C头文件中,我得到了g ++编译错误,我不小心将参数名称用作模板,这显然是不正确的,与c ++关键字模板冲突。

我知道我可以去更改这个参数名称,但我在想为什么这个extern "C"声明不起作用,为什么头文件被认为是C ++代码而不是我想要的C.

g ++版本4.1.1 Linux Red Hat Enterprise。

2 个答案:

答案 0 :(得分:5)

extern "C"只告诉编译器(实际上,链接器) C ++名称修改不适用于在该范围内声明的函数。它与语法或关键字本身无关。

您最好的解决方案是重命名冲突的符号。

答案 1 :(得分:4)

考虑:

extern "C" {
  namespace n
  {
    int& foo(bool b)
    {
      if (!b)
        throw std::invalid_argument("fail!");
      static int i = 0;
      return ++i;
    }
  }
}

此函数具有C语言链接,但使用引用,命名空间和异常,我希望证明extern "C"不会神奇地将编译器切换到编译C,它只是告诉编译器使用C调用约定和C语言链接的函数和变量的符号命名约定(通常只是意味着它禁用名称修改并导致不同命名空间中的匹配声明引用同一实体。)