[英]Assembler and hex dump change when formatting c++ code
我从事的一个 C++ 项目没有一致的缩进。 首席开发人员告诉我重新格式化代码可能不安全。 我认为编译的代码可能无关紧要。 作为测试,我尝试使用基于 Eclipse“GNU [内置]”配置文件的格式化程序重新格式化一个文件。 当我重新编译文件时, md5sum 发生了变化。 我做了一个文件的十六进制转储,它显示一个字节改变了。 我反汇编了object文件。 我还通过调试进行了编译,并获得了源代码行。 我使用 diff 来获取更改的汇编指令。
来源是这条线
logErr
<< xmlutils.GetErrorMessage() << endl;
下面是差异 output 显示更改的程序集
23be: 89 04 24 mov %eax,(%esp)
23c1: e8 fc ff ff ff call 23c2 <_ZN12RerouteAdapt11WriteToFileERKSs+0x64>
23c6: e8 fc ff ff ff call 23c7 <_ZN12RerouteAdapt11WriteToFileERKSs+0x69>
- 23cb: c7 44 24 04 79 01 00 movl $0x179,0x4(%esp)
+ 23cb: c7 44 24 04 84 01 00 movl $0x184,0x4(%esp)
23d2: 00
23d3: 89 04 24 mov %eax,(%esp)
23d6: e8 fc ff ff ff call 23d7 <_ZN12RerouteAdapt11WriteToFileERKSs+0x79>
重新格式化没有改变标题的顺序。
我知道一些 C/C++,但对汇编知之甚少。 我想知道是否有一个简单的解释来解释为什么 object 文件会改变。 我认为 C++ 编译器(RHEL 7 上的 GCC 4.8.2)对格式和空白无动于衷。 在大会上除此之外没有任何区别。
托马斯和蒂姆是对的。 更改的值对应于格式化前后的行号。 我假设“logErr”只是一个 stream。 原来它是一个使用__LINE__
宏的宏。 所以行号在程序集中是硬编码的。
#define logErr theTracer().SetFuncName(__func__); theTracer().SetFile(__FILE__); theTracer().SetLine(__LINE__); theTracer().SetError(); theTracer()
谢谢您的帮助。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.