3

我混合了 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。

4

2 回答 2

5

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

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

于 2012-06-12T10:36:02.840 回答
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 语言链接的变量(这通常意味着它禁用名称修饰并导致不同名称空间中的匹配声明引用同一实体。)

于 2012-06-12T12:47:52.370 回答