将外部“C”放入C++代码中具体做什么?
例如:
extern "C" {
void foo();
}
将外部“C”放入C++代码中具体做什么?
例如:
extern "C" {
void foo();
}
当前回答
由C编译器编译的函数void f()和由C++编译器编译的同名函数void f()不是同一个函数。如果您用C编写了该函数,然后尝试从C++调用它,那么链接器将查找C++函数,而找不到C函数。
extern“C”告诉C++编译器您有一个由C编译器编译的函数。一旦你告诉它它是由C编译器编译的,C++编译器就会知道如何正确调用它。
它还允许C++编译器以C编译器可以调用的方式编译C++函数。该函数将正式成为一个C函数,但由于它是由C++编译器编译的,因此它可以使用所有C++特性,并具有所有C++关键字。
其他回答
它通知C++编译器在链接时以C样式查找这些函数的名称,因为在链接阶段,用C和C++编译的函数的名称不同。
它以这样一种方式更改函数的链接,即该函数可以从C调用。实际上,这意味着函数名不会被破坏。
请参阅下面的链接,该链接是Geeks for Geeks对外部“C”用法的解释。从下面的页面添加重要信息。
考虑函数f()的以下声明
int f (void) { return 1; }
int f (int) { return 0; }
void g (void) { int i = f(), j = f(0); }
C++编译器可能会将上述名称更改为以下名称(来源:Wiki)
int __f_v (void) { return 1; }
int __f_i (int) { return 0; }
void __g_v (void) { int i = __f_v(), j = __f_i(0); }
https://www.geeksforgeeks.org/extern-c-in-c/
extern“C”是指由C++编译器识别,并通知编译器注意到的函数是(或将)以C样式编译的,因此在链接时,它链接到来自C的函数的正确版本。
我只是想添加一些信息,因为我还没有看到它发布。
您将经常看到C头中的代码,如下所示:
#ifdef __cplusplus
extern "C" {
#endif
// all of your legacy C code here
#ifdef __cplusplus
}
#endif
这实现的是,它允许您在C++代码中使用C头文件,因为宏__cplusplus将被定义。但是您也可以将它与遗留的C代码一起使用,因为宏没有定义,所以它不会看到唯一的C++构造。
虽然,我也见过C++代码,例如:
extern "C" {
#include "legacy_C_header.h"
}
我想这也能完成同样的事情。
不知道哪种方式更好,但我都见过。