C 为什么在存在';什么是新线?

C 为什么在存在';什么是新线?,c,gcc,linker,ld,C,Gcc,Linker,Ld,我正在尝试使用ld的-wrap选项拦截对printf的调用。我有两个文件: 主要条款c: #include <stdio.h> int main(void) { printf("printing\n"); printf("printing"); } 我使用以下命令编译: gcc -Wl,-wrap,printf *.c 当我运行生成的a.out二进制文件时,我得到以下输出: printing WRAPPED 如果字符串中有换行符,为什么包装会失败?我检查了我的

我正在尝试使用
ld
-wrap
选项拦截对
printf
的调用。我有两个文件:

主要条款c:

#include <stdio.h>

int main(void) {
    printf("printing\n");
    printf("printing");
}
我使用以下命令编译:

gcc -Wl,-wrap,printf *.c
当我运行生成的
a.out
二进制文件时,我得到以下输出:

printing
WRAPPED

如果字符串中有换行符,为什么包装会失败?我检查了我的系统的
stdio.h
,printf不是宏。这是在gcc 5.3.0中使用的

使用-fno内置选项告诉gcc不要乱动某些指定的函数。因此,如果您添加了-fno内置printf,它应该可以工作。一般来说,它可能会导致编译器发现的一些问题被忽略。有关详细信息,请参阅gcc文档,例如,

如果您与newline交换订单或两者都有,您得到了什么?您是否尝试过关闭优化?gcc可能已将您的printf更改为其他内容,如puts。请查看使用-fno内置选项的情况。使用-fno-builtin或-fno-builtin-printf编译会产生预期的行为(打印包装两次)。即使禁用优化(
-O0
),GCC也会将
printf(“somestring\n”)
转换为对
put(“somestring”)
的调用。
-fno builtin printf
选项控制此行为。
printing
WRAPPED