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语言的编译和链接规则来生成目标文件

posted @ 2017-07-12 17:51  清澈见底  阅读(143)  评论(0编辑  收藏  举报