我在一个 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/