extern "c"(2)

时间:2022-07-26
本文章向大家介绍extern "c"(2),主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

C的头文件:

/*-----------c.h--------------*/
#ifndef _C_H_
#define _C_H_
extern int add(int x, int y);
#endif
C的源文件:
/*-----------c.c--------------*/
int add(int x, int y)
{
   return x+y;
}
C++的调用:
/*-----------cpp.cpp--------------*/
#include "c.h"
void main()
{
  add(1, 0);
}
编译时报错:(注:用g++时不会报错,下面解释)
$ gcc cpp.cpp c.c -lstdc++
/tmp/ccNJ5gxW.o: In function ‘main':
cpp.cpp:(.text+0x19): undefined reference to ‘add(int, int)'
collect2: ld returned 1 exit status
undefined reference to ‘add(int, int)'就表明未查找到_Z3addii的符号表(因为符号表示add)
注:-lstdc++ 申明用c++库
而将c.h改为:
/*-----------c.h--------------*/
#ifndef _C_H_
#define _C_H_
#ifdef __cplusplus
extern "C" {
#endif
extern int add(int, int);
#ifdef __cplusplus
}
#endif
#endif /* _C_H_ */
$ gcc cpp.cpp c.c -lstdc++

源文件为*.c,__cplusplus没有被定义,extern "C" {}这时没有生效对于C他看到只是extern intadd(int, int);add函数编译符号成add源文件为*.cpp(或*.cc,*.C,*.cpp,*.cxx,*.c++), __cplusplus被定义 ,对于C++他看到的是 extern "C" { extern int add( int ,int);}编译器就会知道 add(1, 0);调用的C风格的函数,就会知道去找add符号而不是_Z3addii ;

因此编译正常通过。