extern"C"到底做了什么,起流什么作用
//m.cpp文件
int get();
int main(void){
get();
}
测试环境为ubuntu,测试工具为gcc,编译生成的汇编文件为.s文件
.file "m.cpp"
.text
.globl main
.type main, @function
main:
.LFB0:
.cfi_startproc
pushq %rbp
.cfi_def_cfa_offset 16
.cfi_offset 6, -16
movq %rsp, %rbp
.cfi_def_cfa_register 6
call _Z3getv//get方法经过c++编译规则生成的函数名
movl $0, %eax
popq %rbp
.cfi_def_cfa 7, 8
ret
.cfi_endproc
.LFE0:
.size main, .-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
.globl main
.type main, @function
main:
.LFB0:
.cfi_startproc
pushq %rbp
.cfi_def_cfa_offset 16
.cfi_offset 6, -16
movq %rsp, %rbp
.cfi_def_cfa_register 6
call get//按照c语言规则的函数名
movl $0, %eax
popq %rbp
.cfi_def_cfa 7, 8
ret
.cfi_endproc
.LFE0:
.size main, .-main
.ident "GCC: (Ubuntu 5.4.0-6ubuntu1~16.04.4) 5.4.0 20160609"
.section .note.GNU-stack,"",@progbits
生成的目标代码.o文件
U get
0000000000000000 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_startproc
pushq %rbp
.cfi_def_cfa_offset 16
.cfi_offset 6, -16
movq %rsp, %rbp
.cfi_def_cfa_register 6
movl $0, -4(%rbp)
movl -4(%rbp), %eax
popq %rbp
.cfi_def_cfa 7, 8
ret
.cfi_endproc
.LFE0:
.size _Z3getv, .-_Z3getv
.globl main
.type main, @function
main:
.LFB1:
.cfi_startproc
pushq %rbp
.cfi_def_cfa_offset 16
.cfi_offset 6, -16
movq %rsp, %rbp
.cfi_def_cfa_register 6
call _Z3getv
movl $0, %eax
popq %rbp
.cfi_def_cfa 7, 8
ret
.cfi_endproc
.LFE1:
.size main, .-main
.ident "GCC: (Ubuntu 5.4.0-6ubuntu1~16.04.4) 5.4.0 20160609"
.section .note.GNU-stack,"",@progbits
总结:经过extern“C”修饰过的方法(变量同理),(调用和实现)会以c语言的编译和链接规则来生成目标文件