在C++环境下使用C函数的时候,常常会出现编译器无法找到obj模块中的C函数定义,从而导致链接失败的情况,应该如何解决这种情况呢?
答案与分析:
 C++语言在编译的时候为了解决函数的多态问题,会将函数名和参数联合起来生成一个中间的函数名称,而C语言则不会,因此会造成链接时找不到对应函数的情况,此时C函数就需要用extern “C”进行链接指定,这告诉编译器,请保持我的名称,不要给我生成用于链接的中间函数名。下面是一个标准的写法:
 //在.h文件的头上
 #ifdef __cplusplus
 #if __cplusplus
 extern "C"{
  #endif
  #endif /* __cplusplus */ 
  …
  …
  //.h文件结束的地方
  #ifdef __cplusplus
  #if __cplusplus
 }
 #endif
 #endif /* __cplusplus */ 
也就是说extern与"C"一起连用时,如: extern "C" void fun(int a, int b);则告诉编译器在编译fun这个函数名时按着C的规则去翻译相应的函数名而不是C++的,C++的规则在翻译这个函数名时会把fun这个名字变得面目全非。
在一个源文件里定义了一个数组:char a[6];
 在另外一个文件里用下列语句进行声明:extern char a[];
extern char *a是错误的,数组的a虽然可以理解为指针常数,但并不是指针,不占内存。