优化器和专用于what命令的字符串之间的交互

时间:2016-04-23 21:53:55

标签: c++ c

命令"什么"用于我的项目查询有关可执行文件的一些和平信息(编译日期,版本,...)。 我正在修复一个错误,因为我们更改了gcc的版本,因此在输出中缺少一行。该字符串在本地范围内定义:

char string_for_what = "@(#) Component comp1";

此字符串从未使用过。我假设优化器已将其删除。

我认为正常的修正应该是在全局范围内声明字符串。但是,如果不使用它会阻止未来的编译器对其进行优化?

我考虑过调用strlen("@(#) Component comp1")以确保使用该字符串,但似乎clang正在优化此调用常量字符串。

我打电话给fopen("@(#) Component comp1")?如果有人创建了具有此名称的文件,我可能会丢失一个文件描述符。这似乎有效,但似乎也有点矫枉过正。

1 个答案:

答案 0 :(得分:1)

将此声明移至全局范围可能很容易导致违反One Definition Rule

您可以使用volatile关键字禁止优化这些变量。

  

[C++11: 3.7.3:]如果具有自动存储持续时间的变量具有初始化或a   具有副作用的析构函数,在结束前不得销毁   它的块,即使它也不会作为优化被消除   似乎未被使用,(...)

  

[C++11: 1.9.12:]访问由volatile glvalue(3.10)指定的对象,进行修改   一个对象,调用库I / O函数,或调用一个函数   这些操作中的任何一种都是副作用