第1个回答 2010-05-31
主要是用extern " C"
c++比C语言里多了模板机制与重载机制,在编译的时候会生成内部名称。例如:
int f(void,double);//生成int f_void_double(void,double);
int f(int ,long);//生成int f_int_long(int,long);
template<typename T>
int fun(void);//用int实例化就可能会出现int int_fun(void);
C语言没有这些机制,当然也没有内部名称。于是在C++的目标文件(.obj)与C语言的目标文件链接(link)的时候,就会与C++出现连接问题。
extern"C"就是指需要连接的文件,不用C++的命名方式。
第2个回答 2010-05-31
应该是调用C编译的函数之类的吧,加上
extern "C"
{
}
具体如下:
作为一种面向对象的语言,C++支持函数重载,而过程式语言C 则不支持。函数被C++编译后在symbol 库中的名字与C 语言的不同。例如,假设某个函数的原型为:void foo(int x, int y);该函数被C 编译器编译后在symbol 库中的名字为_foo,而C++编译器则会产生像_foo_int_int 之类的名字。_foo_int_int 这样的名字包含了函数名和函数参数数量及类型信息,C++就是考这种机制来实现函数重载的。为了实现C和C++的混合编程,C++提供了C 连接交换指定符号extern "C"来解决名字匹配问题,函数声明前加上extern "C"后,则编译器就会按照C 语言的方式将该函数编译为_foo,这样C 语言中就可以调用C++的函数了。解在C++中引用C语言中的函数和变量,在包含C语言头文件(假设为cExample.h)时,需进行下列处理:
extern "C"
{
#include "cExample.h"
}
第3个回答 2010-05-31
--------------------------------------------------------------------
LZ,请仔细阅读我下边的一番描述,纯手写.
在C++里,想要调用C类库,比如:<stdlib.h>里的库函数qsort(),你也许会extern qsort();声明一下,然后就进行使用. 问题就出在这里, 这里要明白一些简单的编译原理了.
首先,<stdlib.h>里声明的所有函数(例如其中的qsort),它们都已经在一些Cpp文件里编译好了,是前辈们给你直接使用的函数,在最初它们被编译时,它们都是在C环境下完成的,C编译器给它们编译时会起一个函数别名,例如qsort就是C_qsort.
当你在C++类型文件中,extern qsort()以后,你认为可以直接使用了,于是你编译,连接, 想要执行,但是问题就在编译与连接部分. qsort已经被前辈们在C环境下编译过了,有了自己的名字C_qsort. 现在你在C++下,extern qsort()声明这个函数, C++编译器在编译时给它起了一个名字Cpp_qsort,然后现在要连接所有文件,找到qsort()这个函数的定义在哪里。 现在连接器相当于拿着Cpp_qsort去其他的cpp里找Cpp_qsort的定义,当然是找不到的,因为qsort()函数是以前在C环境下编译的,名字叫c_qsort.
说白了,就是C编译器与C++编译器对函数起名的方式不同. 利用extern "C"就是给C++编译器一个提示,告诉你这个函数请给我用C的方式起名,在连接时就可以找到与这个名字相符的函数,并调用了。
写这么多,希望LZ有所收获,也能追加几个分。