网站首页 > 基础教程 正文
作用:extern "C"为解决C和C++混合编程而产生的,若程序只用 C + + 编写,可以不考虑混extern "C"。
extern "C"是C++指令,C编译器不认识该指令,此指令是告诉 C + +编译器extern "C"包括起来的代码中若有函数名称,则函数名称不要改编(C+ +为支持函数重载会进行函数名改编)
函数名改编
若自己写了一个类库add.h、add.c,此类库负责实现加法,文件内容如下
// add.h
#ifndef _ADD_H
#define _ADD_H
int add(int a, int b);
#endif
// add.c
#include "add.h"
int add(int a, int b) {
return a + b;
}
我们使用gcc、g++分别进行C编译、C + + 编译成汇编代码,查看.s文件内容
.globl add // gcc -S add.c
.globl _Z3addii // g++ -S add.c
可以看出C + + 对add函数名字进行了改编,变成了_Z3addii
应用场景:若一个项目组中有的成员负责类库编写(C实现,如上面的add.h、add.c,并以C库编译的方式进行编译),有的成员负责写应用层调用(如下main.cpp)
// main.cpp
#include
#include "add.h"
int main() {
printf("%d\n", add(3, 5));
}
最后开发完成,程序模块合并编译main.cpp时会报如下错误:
gcc -c add.c // 工具类库使用C方式编译
g++ add.o main.c -o main // 应用层使用C + +编译成可执行代码
/tmp/ccx9lXVw.o: In function `main':
main.cpp:(.text+0xf): undefined reference to `add(int, int)'
collect2: ld returned 1 exit status
可以看出main.cpp在连接时未找到_Z3addii,因为工具库以C方式编译,目标文件中函数名为add,main.cpp以C + +方式编译,找add函数时实际上去类库中找 _Z3addii,当然找不到了,解决办法就是告诉 C+ +编译器 add函数名不要改编(即加上extern "C"),故将add.h内容修改如下,C + + 代码中引用add.h时就不会改编 add 函数
// add.h
#ifndef _ADD_H
#define _ADD_H
#ifdef __cplusplus
extern "C" {
#endif
int add(int a, int b);
#ifdef __cplusplus
}
#endif
#endif
结论:若功能库是使用C语言写的,为了以后C++能使用,需要在功能库的头文件中使用extern C语句,以本例来说,功能库 add.h、add.c 为C语言写的,所以在add.h中添加extern C语句即可
- 上一篇: 嵌入式C语言基础编程—5年程序员给你讲函数,你真的懂函数吗?
- 下一篇:已经是最后一篇了
猜你喜欢
- 2025-03-10 嵌入式C语言基础编程—5年程序员给你讲函数,你真的懂函数吗?
- 2025-03-10 C++知识点 13:extern“C”
- 03-10extern "C"用法详解
- 03-10嵌入式C语言基础编程—5年程序员给你讲函数,你真的懂函数吗?
- 03-10C++知识点 13:extern“C”
- 03-10go语言text/template标准库
- 03-10Python 的os和shutil包简介
- 03-10前端代码质量-圈复杂度原理和实践
- 03-10近2万字详解JAVA NIO2文件操作,过瘾
- 03-10这两个Python库,轻而易举就能实现MP4与GIF格式互转,太好用了
- 最近发表
- 标签列表
-
- gitpush (61)
- pythonif (68)
- location.href (57)
- tail-f (57)
- pythonifelse (59)
- deletesql (62)
- c++模板 (62)
- css3动画 (57)
- c#event (59)
- linuxgzip (68)
- 字符串连接 (73)
- nginx配置文件详解 (61)
- html标签 (69)
- c++初始化列表 (64)
- exec命令 (59)
- canvasfilltext (58)
- mysqlinnodbmyisam区别 (63)
- arraylistadd (66)
- node教程 (59)
- console.table (62)
- c++time_t (58)
- phpcookie (58)
- mysqldatesub函数 (63)
- window10java环境变量设置 (66)
- c++虚函数和纯虚函数的区别 (66)