前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >extern "c"(2)

extern "c"(2)

作者头像
随心助手
发布2020-10-10 10:05:38
5330
发布2020-10-10 10:05:38
举报
文章被收录于专栏:nginx遇上redisnginx遇上redis

C的头文件:

代码语言:javascript
复制
/*-----------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 ;

因此编译正常通过。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-10-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 nginx遇上redis 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档