您的位置:首页 > 其它

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

2017-07-12 17:51 316 查看
//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语言的编译和链接规则来生成目标文件
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: