extern"C"到底做了什么,起流什么作用

来源:互联网 发布:qq三国白菜数据 编辑:程序博客网 时间:2024/04/30 08:44
//m.cpp文件int get();int main(void){get();}

测试环境为ubuntu,测试工具为gcc,编译生成的汇编文件为.s文件

.file"m.cpp".text.globlmain.typemain, @functionmain:.LFB0:.cfi_startprocpushq%rbp.cfi_def_cfa_offset 16.cfi_offset 6, -16movq%rsp, %rbp.cfi_def_cfa_register 6call_Z3getv//get方法经过c++编译规则生成的函数名movl$0, %eaxpopq%rbp.cfi_def_cfa 7, 8ret.cfi_endproc.LFE0:.sizemain, .-main.ident"GCC: (Ubuntu 5.4.0-6ubuntu1~16.04.4) 5.4.0 20160609".section.note.GNU-stack,"",@progbits
编译生成的目标文件.o

0000000000000000 T main                 U _Z3getv

对get方法加上extern “C”修饰

extern "C"{int get();}int main(void){get();}


生成的.s文件

.file"m.cpp".text.globlmain.typemain, @functionmain:.LFB0:.cfi_startprocpushq%rbp.cfi_def_cfa_offset 16.cfi_offset 6, -16movq%rsp, %rbp.cfi_def_cfa_register 6callget//按照c语言规则的函数名movl$0, %eaxpopq%rbp.cfi_def_cfa 7, 8ret.cfi_endproc.LFE0:.sizemain, .-main.ident"GCC: (Ubuntu 5.4.0-6ubuntu1~16.04.4) 5.4.0 20160609".section.note.GNU-stack,"",@progbits

生成的目标代码.o文件

                 U get0000000000000000 T main


源文件


int get();int get(){int ddd=0;return ddd;}int main(void){get();}
生成的.s文件

.file"m.cpp".text.globl_Z3getv.type_Z3getv, @function    Z3getv://get函数的实现.LFB0:.cfi_startprocpushq%rbp.cfi_def_cfa_offset 16.cfi_offset 6, -16movq%rsp, %rbp.cfi_def_cfa_register 6movl$0, -4(%rbp)movl-4(%rbp), %eaxpopq%rbp.cfi_def_cfa 7, 8ret.cfi_endproc.LFE0:.size_Z3getv, .-_Z3getv.globlmain.typemain, @functionmain:.LFB1:.cfi_startprocpushq%rbp.cfi_def_cfa_offset 16.cfi_offset 6, -16movq%rsp, %rbp.cfi_def_cfa_register 6call_Z3getvmovl$0, %eaxpopq%rbp.cfi_def_cfa 7, 8ret.cfi_endproc.LFE1:.sizemain, .-main.ident"GCC: (Ubuntu 5.4.0-6ubuntu1~16.04.4) 5.4.0 20160609".section.note.GNU-stack,"",@progbits


总结:经过extern“C”修饰过的方法(变量同理),(调用和实现)会以c语言的编译和链接规则来生成目标文件