在 C++ 源代码中,我们经常会看到下面的代码:
#ifdef _cplusplus
extern "C" {
#endif
/* ..... */
#ifdef _cplusplus
#endif
那么它的作用是什么呢,其实 extern "C"是 C++ 中的一种声明,它是告诉编译器将这部分代码按照 C 语言的形式进行编译和链接,我们都知道,
C 和 C++ 编译器对函数和变量的处理是完全不同的,因此,为了使得 C 语言和 C++ 语言能互相调用,我们必须要约定它们之间的形式统一,以使得
C 和 C 语言能互相之间能互相调用,这也就是 extern "C"的作用。如果不存在两者之间的互相调用,则不需使用 extern "C"进行声明。
下面举例来说明:
(1)C 语言中调用 C++ 的函数或变量
TestCpp.cpp
TestC.c 中调用上面 cpp 中全局变量和函数 add
这个时候我们运行程序的时候会提示找不到符号
这是因为 C++ 方式编译的符号和 C 使用的符号不统一,导致 C 链接时找不到该符号,如果这是使用 extern "C" 修饰 C++ 变量和函数,则 C++ 编译
时会使用 C 语言的方式,这是 C 语言链接时则能正确找到符号,TestCpp.cpp 改成下面的形式:
这时候 C 语言能正常链接起来。
在我们实际的项目中,我们会涉及到很多这样的需要被 C 调用的函数和变量,这时我们统一把这些使用 extern "C" {}声明,这里添加一个 Test.h 文件
TestCpp.cpp
TestC.c
Test.h
(2)在 C++ 中调用 C 语言
这里我们只把两个源文件内容对换,头文件因为有预编译宏__cplpusplus 我们不需要做任何改变
TestCpp.cpp
TestC.c
总之,extern "C"是在 C++ 中使用的一种声明,它的作用就是编译工具安装 C 语言的方式去进行编译和链接,以达到 C 与 C++ 之间互调的目的。
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于