codeblock中C++调用C代码

来源:互联网 发布:mac speak louder 编辑:程序博客网 时间:2024/05/05 18:17

#ifdef __cplusplus

extern "c" {

#endif

 

。。。。。。。

 

#ifdef __cplusplus

}

#endif

 

这一对声明块的出现主要是不同语言的编译器对函数名的处理不一样。C编译器不会改变目标文件中的函数名,而C++编译器会根据C++的语言规则对函数名进行修饰。

在C++中,调用一个函数时,编译器会先对这个函数名进行修饰,生成目标符号名,然后到工程包含的符号表中查找这个修饰后的符号名,找到了就会调用。而因为C编译器不会对C函数进行修饰,所以C++编译器在用修饰后的符号名在符号表中查找时,就会找不到对象。

这一对声明块就是告诉C++编译器,不要对块内的内容进行名字修饰,而是采用C的方式生成符号名。这样C++编译器就会用C编译器处理方式处理过的符号名到符号表中去查找,就能找到了。

 

codeblock中的编译器分别对C和CPP代码设置了编译器,比如我的GNU的设置是GCC和G++。

当一个工程中既包含CPP文件也包含C文件时,codeblock自动对C文件用GCC编译,对CPP文件用G++编译。

这样一来,当从CPP文件调用C文件的程序时,就会因为不同编译器生成的函数名不一致而发生找不到函数的情况。

 

解决方案有两个:

1、把C编译器也设置成G++,从而所有的函数名都采用C++的名称修饰。

2、从CPP引用C头文件或者函数时加上 上面的声明块。

3、在C头文件中加上 上面的声明块。

 

如果要从C++代码中调用C源代码,需要在引用C头文件时,用

 

#ifdef __cplusplus

extern "c" {

#endif

 

#include "myCHead.h"

 

#ifdef __cplusplus

}

#endif

 

在C头文件中把函数声明放在

 

#ifdef __cplusplus

extern "c" {

#endif

 

int hello();

 

#ifdef __cplusplus

}

#endif

 

这样,在C++代码中include这个头文件时,就不需要加上这两个预编译块。

原创粉丝点击