gpt4 book ai didi

linux - 如何停止 GCC 从 obj 文件中的字符串文字中剥离尾随换行符?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:17:34 24 4
gpt4 key购买 nike

在 Linux 下工作,我刚遇到以下问题。 (肯定有人会给我答案,但到现在为止,我没有找到任何简单明了的答案:)

/*compile with gcc -o out.x hello.c*/

#include<stdio.h>

int main()
{
printf("Hello World2\r\n");
printf("Hello World3\r\n ");

return 0;
}

在 Linux 下运行以下代码会得到两个字符串,但结尾字符不同:第一个输出以 0x0d 结尾,而第二个以 0x0d,0x0a 结尾。

正如您在 obj 文件中看到的那样,这是由编译器 (GCC) 完成的:

Contents of section .rodata:
400610 01000200 48656c6c 6f20576f 726c6432 ....Hello World2
400620 0d004865 6c6c6f20 576f726c 64330d0a ..Hello World3..
400630 2000 .

所以,问题是:

  • 为什么?
  • 我怎样才能避免这种“优化”(!?)

谢谢

最佳答案

在运行时创建格式化输出需要时间; printf 调用很慢。 GCC 知道这一点,所以 replaces第一个调用 puts 的函数.由于 puts 自动添加一个 \n,GCC 需要从字符串中删除 \n 以进行补偿。

GCC 这样做是因为它认为 printfbuilt-in .因为这对字节输出甚至对 write 的调用次数都没有影响;我强烈建议保持原样。如果你确实想禁用它,你can pass -fno-builtin-printf,但唯一的影响是减慢您的代码,因为它会尝试对字符串进行不必要的格式化。

关于linux - 如何停止 GCC 从 obj 文件中的字符串文字中剥离尾随换行符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48080755/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com