使用 g++ 时,使用 extern "C" { 对C++代码的影响

Impact of using extern "C" { on C++ code when using g++

本文关键字:使用 C++ 代码 影响 g++ extern      更新时间:2023-10-16

当使用G ++(例如Linux上的4.5版本)时,任何人都可以解释如果用户为混合C/C++系统编写头文件会发生什么,如下所示:

#ifdef __cplusplus 
extern "C" {
int myCPPfunc(some_arg_list....); /* a C++ function */
}
#endif

但这里myCPPfunc()是一个普通的C++函数,里面有一个类 def - 即它被错误地标记为 C 函数。

这有什么影响?

这样做的主要影响是你不能重载它,例如,这是合法的:

int myCPPfunc(int a);
int myCPPfunc(char a);

但这不是:

extern "C"
{
    int myCPPfunc(int a);
    int myCPPfunc(char a);
}

extern "C"函数的实现使用任意C++功能是完全合法的。 你不能做的是让它的接口成为你在 C 语言中无法做到的事情,例如参数重载、方法(虚拟或其他)、模板等。

请注意,许多"在 C 中无法执行的操作"情况会引发未定义的行为,而不是提示编译错误。

这告诉C++编译器在头文件中声明的函数是 C 函数。

http://www.parashift.com/c++-faq-lite/mixing-c-and-cpp.html#faq-32.2

这正是

extern "C"的用途 - 它允许您编写可以从 C 调用的 C++ 函数。

从本质上讲,该声明告诉C++编译器您希望C++函数myCPPfunc()具有可从 C 链接(因此可调用)的外部接口。

该函数的实现仍然C++,仍然可以使用C++功能。

通常,头文件中函数的声明可能更像:

#ifdef __cplusplus 
extern "C" {
#endif
int myCPPfunc(some_arg_list....); /* a C++ function */
#ifdef __cplusplus 
}
#endif

这允许C++编译器或 C 编译器使用相同的头文件,并且每个编译器都会将其视为声明 C 可调用函数。