易采站长站为您分析C和C++混合编程问题,需要的朋友可以参考下
分析以下一段代码:
- /*=======sum.h=========*/
- #ifndef SUM_H #define SUM_H
- #include <stdio.h>
- int sum(int a,int b);
- #endif;
- /*=======sum.c=========*/
- #include "sum.h"
- int sum(int a,int b) {
- int c=a+b; return c;
- }
- /*====main.cpp======*/
- #include "sum.h"
- void mian(){
- cout << sum(1,2)<<endl;
- }
调用以上三个文件,编译通过,但是执行是出现以下问题:
obj : error LNK2001: 无法解析的外部符号 "int __cdecl sum(int,int)" (?sum@@YAHHH@Z)
E:ProgrammingGrapictestDebugtest.exe : fatal error LNK1120: 1 个无法解析的外部命令
问题出在哪里呢? 在main.cpp里调用了sum.c,也就是说在C++程序里调用了C程序,此时如果没有作相应处理将会出现链接错误。
extern "C"表示编译生成的内部符号名使用C约定。C++支持函数重载,而C不支持,两者的编译规则也不一样。函数被C++编译后在符号库中的名字与C语言的不同。例如,假设某个函数的原型为:void foo( int x, int y ); 该函数被C编译器编译后在符号库中的名字可能为_foo,而C++编译器则会产生像_foo_int_int之类的名字(不同的编译器可能生成的名字不同,但是都采用了相同的机制,生成的新名字称为“mangled name”)。_foo_int_int这样的名字包含了函数名、函数参数数量及类型信息,C++就是靠这种机制来实现函数重载的。










