c++ - 外部 "C"是否应包含 C++ 函数的声明或定义?

标签 c++ c

我在一个 cpp 文件中看到 external "C"{...} 包含了几个函数的定义。

来自 https://isocpp.org/wiki/faq/mixing-c-and-cpp ,我猜想在 cpp 文件中使用 extern "C" 的目的是使封闭的 C++ 函数可以在 C 程序中使用。

链接中的示例显示 extern "C" 仅包含 C++ 函数的声明,而不包含它们的定义

Just declare the C++ function extern "C" (in your C++ code) and call it (from your C or C++ code). For example:

    // C++ code:
    extern "C" void f(int);
    void f(int i)
    {
        // ...
    }

我一开始提到的cpp文件看起来是这样的:

    // C++ code:
    extern "C" {

    void f(int i)
    {
        // ...
    }

    void g(int i)
    {
        // ...
    }

    }

extern "C" 是否应包含 C++ 函数的声明或定义? 如果有,为什么?

最佳答案

它应该将声明包含在头文件中,并且只要翻译单元是使用 c++ 编译器编译的,并且只要在那里没有看到声明,就应该包含定义。
在 c++ 代码中两者都做永远不会错。

如果使用 c 编译器来编译函数定义,则没有必要(或者我应该说是错误的语法,请参阅下面的注释)。

extern "C"{} 范围控制纯 c 符号链接(symbolic link)用于内部的所有内容。否则 c++ name mangling将被应用。


注意:

由于 extern "C"{} 这不是有效的 c 语法,要使其与 c 编译器一起使用,您需要在 #ifdef 中使用它>:

MyHeader.h:

 #ifdef __cplusplus
 extern "C" {
 #endif

 // ... c style function name declarations
 void foo(int i);

 #ifdef __cplusplus
 } // extern "C"
 #endif

extern "C"{} 作用域的使用实际上是双重的:


将 C++ 代码导出到 C

如果上面是用 c 编译器编译的,它会显示为一个普通的 c 函数声明。如果使用 c++ 编译器编译,则应用 extern 关键字,并且 c++ 名称修改将被禁止。

关于定义,该函数可以使用其定义中的任何 c++ 特性:

 extern "C" {
     void foo(int x) {
         std::vector v(x);
         // ... blah, more c++ stuff
     }
 }

请注意,此处未包含声明。这可以用作一种技术,当您想要覆盖从库中为 weak linkage 公开的函数时特别有用。 .

如果包含 MyHeader.h,则可以省略 extern "C"{} 范围。


从 C++ 导入 C 代码

如果在 c++ 编译器中看到上述声明,则再次抑制 c++ 名称修改,并且对 foo() 的任何调用引用将由链接器使用纯 c 函数符号名称解析:

  #include "MyHeader.h"
  class MyClass {
  public:
       void bar(int y) {
           // Use foo() as plain c function:
           foo(y);
       }
  };

foo() 函数实现由使用 c 编译器创建的目标文件(或存档)提供。

关于c++ - 外部 "C"是否应包含 C++ 函数的声明或定义?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37927388/

相关文章:

c++ - 为什么不能将临时对象作为 ref args 发送给 C++ 中的函数?

c++ - 如何使用 WinCrypt 和 C++ 以 PEM 格式导入私钥?

c++ - 对象反射

c++ - 在小端和大端上进行位移

c++ - 生成混淆代码的 C/C++ 编译器

c - Ubuntu 中的 FTP 主动模式客户端错误 : I won't open a connection to 127. 0.1.1

c++ - 返回值类型与函数类型 CONST 不匹配

c - 读取文本文件并对两个数组进行排序

c - 总共有多少读或写文件描述符?

c - 在C语言中查找数组中正整数的最大和。