__cplusplus宏告诉 g++ C 标头声明工作不奇怪

__cplusplus macro to tell g++ about C header declarations not working strangely

本文关键字:声明 工作 cplusplus g++      更新时间:2023-10-16

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

extern "C" 仅告诉编译器

(实际上是链接器),C++名称重整不适用于在该作用域中声明的函数。它与语法或关键字本身无关。

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

考虑:

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 调用约定和符号命名约定(这通常只是意味着它禁用名称重整并导致不同命名空间中的匹配声明引用同一实体。