命令"什么"用于我的项目查询有关可执行文件的一些和平信息(编译日期,版本,...)。 我正在修复一个错误,因为我们更改了gcc的版本,因此在输出中缺少一行。该字符串在本地范围内定义:
char string_for_what = "@(#) Component comp1";
此字符串从未使用过。我假设优化器已将其删除。
我认为正常的修正应该是在全局范围内声明字符串。但是,如果不使用它会阻止未来的编译器对其进行优化?
我考虑过调用strlen("@(#) Component comp1")
以确保使用该字符串,但似乎clang正在优化此调用常量字符串。
我打电话给fopen("@(#) Component comp1")
?如果有人创建了具有此名称的文件,我可能会丢失一个文件描述符。这似乎有效,但似乎也有点矫枉过正。
答案 0 :(得分:1)
将此声明移至全局范围可能很容易导致违反One Definition Rule。
您可以使用volatile
关键字禁止优化这些变量。
[C++11: 3.7.3:]
如果具有自动存储持续时间的变量具有初始化或a 具有副作用的析构函数,在结束前不得销毁 它的块,即使它也不会作为优化被消除 似乎未被使用,(...)
和
[C++11: 1.9.12:]
访问由volatile glvalue(3.10)指定的对象,进行修改 一个对象,调用库I / O函数,或调用一个函数 这些操作中的任何一种都是副作用