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这个头文件时,就不需要加上这两个预编译块。
- codeblock中C++调用C代码
- c++IDE搭建---codeblock
- C代码中调用Ruby
- MATLAB中调用C代码
- matlab中调用C代码
- 在C#中调用C/C++代码
- 如何在windows下用CodeBlock编译Objective-C代码
- Java代码中调用C/C++代码
- c代码中调用c++,c++代码中调用c代码
- C,C++代码中调用python脚本
- C,C++代码中调用python脚本
- java中调用C语言代码
- java中调用C语言代码
- Java中如何调用C/C++代码
- 在C中调用Lua代码
- java中如何调用c/c++代码
- Eclipse中编写Java调用C代码
- 在C/C++中调用Java代码
- Adapter Pattern
- avascript读取XML(兼容所有浏览器)
- time,gettimeofday,clock_gettime,_ftime (转载)
- 钳位电路
- android ndk 开发之 在 应用程序中使用 jni
- codeblock中C++调用C代码
- 【转】一步一步学Linq to sql(二):DataContext与实体
- 1229
- Java中替换单引号为/'
- ping广播地址会如何(转)
- Java 设计模式分类
- BAD packet signature 18245
- 实战数据库版本的降迁(Discuz!NT 3.6.519 RC 后台数据库SQL2008降为SQL2005版本)
- 【转】一步一步学Linq to sql(一):预备知识