使用extern在C或C ++中包含文件

时间:2010-02-15 06:44:07

标签: c++ c include extern

这在C或C ++中是如何工作的?

extern "C" {
#include <unistd.h>
#include <fd_config.h>
#include <ut_trace.h>
#include <sys/stat.h>
#include <sys/types.h>
}

4 个答案:

答案 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语言编写的遗留代码,用于特定功能,这是当前程序所必需的。

如何实现它主要是依赖于编译器的,但是我听说许多编译器禁用名称修改并更改调用约定。