2016-04-23 47 views
1

我的項目中使用的命令「what」用於查詢有關可執行文件(編譯日期,版本,...)信息的一些信息。 我正在修復一個錯誤,因爲我們已經改變了gcc的版本,在哪個輸出中缺少一行。該字符串在本地範圍內定義:優化器和專用於what命令的字符串之間的交互

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

該字符串從未使用。我假設優化器已將其刪除。

我認爲正常的修正應該是在全局範圍聲明字符串。但是,如果未使用,那麼禁止將來的編譯器優化它呢?

我想過要調用strlen("@(#) Component comp1")來確保字符串被使用,但看起來clang正在優化掉常量字符串的這個調用。

我叫fopen("@(#) Component comp1")?如果有人用這個名字創建一個文件,我可能會丟失一個文件描述符。這似乎工作,但似乎也有點矯枉過正。

+0

可能的複製http://stackoverflow.com/questions/ 16349557/does-gcc-have-any-options-to-add-version -info-elf-binary-file –

回答

1

將此聲明移至全局範圍可能很容易導致違反One Definition Rule

您可以禁止使用volatile關鍵字優化這些變量。

[C++11: 3.7.3:]如果具有自動存儲持續時間的變量的初始化或 析構函數與副作用,故不應被結束其塊的 之前被破壞,也不應被消除作爲優化,即使它 出現爲未使用,(...)

和:

[C++11: 1.9.12:]訪問由揮發性glvalue指定的對象(3 0.10),修改 一個對象,調用庫I/O功能,或調用一個函數, 做任何這些操作都是副作用

+0

你是否建議volatile char string_for_what [] =「@(#)Component comp1」;或揮發性字符串string_for_what(「@(#)Component comp1」); ?非常感謝你 – BOC

+0

@BOC我會使用一個char數組。 –