C和C++混合编程问题

2020-01-06 13:47:28王振洲

易采站长站为您分析C和C++混合编程问题,需要的朋友可以参考下

分析以下一段代码:

 

 
  1. /*=======sum.h=========*/   
  2. #ifndef SUM_H  #define SUM_H 
  3. #include <stdio.h>   
  4. int sum(int a,int b);   
  5.   #endif; 
  6.   /*=======sum.c=========*/ 
  7.   #include "sum.h" 
  8.    
  9. int sum(int a,int b)  { 
  10. int c=a+b;  return c; 
  11. }   
  12. /*====main.cpp======*/   
  13. #include "sum.h"   
  14. void mian(){   
  15. 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++就是靠这种机制来实现函数重载的。