当使用 G++(例如 Linux 上的 4.5 版)时,任何人都可以解释如果用户为混合 C/C++ 系统编写头文件会发生什么,如下所示:
#ifdef __cplusplus
extern "C" {
int myCPPfunc(some_arg_list....); /* a C++ function */
}
#endif
但这myCPPfunc()
是一个普通的 C++ 函数,里面有一个类 def - 即它被错误地标记为 C 函数。
这有什么影响?
The main impact of this is that you cannot overload it, e.g. this is legal:
int myCPPfunc(int a);
int myCPPfunc(char a);
But this is not:
extern "C"
{
int myCPPfunc(int a);
int myCPPfunc(char a);
}
这告诉 C++ 编译器在头文件中声明的函数是 C 函数。
http://www.parashift.com/c++-faq-lite/mixing-c-and-cpp.html#faq-32.2
让函数的实现extern "C"
使用任意 C++ 特性是完全合法的。你不能做的是让它的接口是你在 C 中做不到的,例如参数重载、方法(虚拟或其他)、模板等。
请注意,许多“在 C 中无法做到的事情”情况会引发未定义的行为,而不是提示编译错误。
这正是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 可调用函数。