这在C或C ++中是如何工作的?
extern "C" {
#include <unistd.h>
#include <fd_config.h>
#include <ut_trace.h>
#include <sys/stat.h>
#include <sys/types.h>
}
答案 0 :(得分:5)
C ++标准没有规定编译器应如何在其目标文件中命名符号(例如,Foo::bar()
可能最终为__clsFoo_fncBar
或某些gobbledygook)。 C标准确实如此,它几乎总是与C ++编译器的不同(C不必处理类,名称空间,重载等)。
因此,当您链接C编译器输出的目标文件时,您必须告诉C ++编译器查找名称与C标准对应的符号。你基本上把它放在“C模式”。这就是"C"
的{{1}}部分。
(或者,您也可以声明可以由外部C对象文件使用的函数或变量。在这种情况下,它意味着以C方式导出这些符号。)
答案 1 :(得分:2)
如果您的项目有C和C ++源文件,并且您需要构建一个整体(C文件调用C ++文件中的某些函数),那么我们需要通过在C ++文件中声明来保护C文件函数调用和符号
extern“C” { / c文件中使用的符号 / uint8 GetCurrentthreadState(HANDLE ThreadId)
}
然后C ++编译器生成编译输出,该编译输出与上述声明的函数和符号的C编译器相同。因此,在链接时,编译器可以轻松地链接C和C ++定义的符号,而不会出现任何链接错误。
所以我不需要在编译时给出 #ifdef __cplusplus 检查。 因为我们需要保护c ++文件中的符号吗? C ++文件只能由C ++编译器编译吗?
/ renjith g
答案 2 :(得分:1)
它不起作用,你需要添加cplusplus预处理器......
#ifdef __cplusplus
extern "C" {
#endif
// your code
#ifdef __cplusplus
}
#endif
编辑:
在C ++中,名称将被视为在C中,这意味着将没有mangle名称。它允许在库中使用不同参数类型/数字或不同命名空间的两个C ++不同函数之间的区别(对于库目的libname.so,libname.a)。如果名称被破坏,C程序将无法识别它
eg:
int myfction()
void myfunction(int)
void myfunction(int, char)
C library: myfction
C++ library: int_myction (it depend on your compiler)
C++ library: int_myction_int (it depend on your compiler)
C++ library: int_myction_int_char (it depend on your compiler)
// ... which is not allowed in C program
答案 3 :(得分:0)
每个C ++编译器都需要支持extern“C”链接。 这种块中的代码可以是用C语言编写的遗留代码,用于特定功能,这是当前程序所必需的。
如何实现它主要是依赖于编译器的,但是我听说许多编译器禁用名称修改并更改调用约定。