C/C++混合编程的问题 Q1:如果C++程序要调用已经被编译后的C 函数,该怎么办
A1: 假设某个C 函数的声明如下: void foo(int x, int y); 该函数被C 编译器编译后在库中的名字为_foo,而C++编译器则会产生像_foo_int_int之类的名字用来支持函数重载和类型安全连接
由于编译后的名字不同,C++程序不能直接调用C 函数
C++提供了一个C 连接交换指定符号extern“C”来解决这个问题
例如: extern “C” { void foo(int x, int y); „ // 其它函数 } 或者写成 extern “C” { #include “myheader
h” „ // 其它C 头文件 } 这就告诉C++编译译器,函数foo是个C连接,应该到库中找名字_foo 而不是找_foo_int_int
另外说明一点:C++编译器开发商已经对C 标准库的头文件作了extern“C”处理,所以我们可以用#include 在 C++程序中直接引用这些头文件
-------C++直接可以引用C 标准库的原因,反之不可
Q2 :如何理解extern "C" A2: extern "C" 包含双重含义,从字面上即可得到:首先,被它修饰的目标是“extern”的;其次,被它修饰的目标是“C”的
让我们来详细解读这两重含义
被 extern "C"限定的函数或变量是extern 类型的; extern 是 C/C++语言中表明函数和全局变量作用范围(可见性)的关键字,该关键字告诉编译器,其声明的函数和变量可以在本模块或其它模块中使用
记住,下列语句: extern int a; 仅仅是一个变量的声明,其并不是在定义变量a,并未为a 分配内存空间
变量a 在所有模块中作为一种全局变量只能被定义一次,否则会出现连接错误
通常,在模块的头