请解释这个片段:
#include <stdio.h>
int puts(const char *str) {
fputs("Hello world!\n", stdout);
}
int main() {
printf("Goodbye\n");
}
Run Code Online (Sandbox Code Playgroud)
输出:Hello world!返回13
我编译了程序gcc x.c -S -o-.它给了我
[...]
main:
.LFB1:
.cfi_startproc
pushl %ebp
.cfi_def_cfa_offset 8
.cfi_offset 5, -8
movl %esp, %ebp
.cfi_def_cfa_register 5
andl $-16, %esp
subl $16, %esp
movl $.LC1, (%esp)
call puts
leave
.cfi_restore 5
.cfi_def_cfa 4, 4
ret
.cfi_endproc
.LFE1:
Run Code Online (Sandbox Code Playgroud)
实际上,printf调用puts在GCC中被替换,因为它们具有相同的语义.
我的猜测是,编译器改变了呼叫printf()到一个电话puts(),因为没有必要printf(),由于没有格式.该字符串也由换行符终止puts().编译器没有看到你的库函数的可怕重载,所以它被"愚弄"了.