2016-04-23 2 views
1

プロジェクトで実行ファイル(コンパイル日、バージョン、...)に関する情報を照会するために "what"がプロジェクトで使用されています。 gccのバージョンを変更したので、出力に1行がないバグを修正しました。文字列はローカルスコープで定義されています。オプティマイザとwhatコマンド専用の文字列とのやりとり

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

この文字列は使用されていません。私は、オプティマイザがそれを削除したと仮定します。

通常の修正は、文字列をグローバルスコープで宣言することです。しかし、将来のコンパイラが使用されていない場合、それを最適化することを禁止しているのは何ですか?

文字列が使用されていることを確認するためにstrlen("@(#) Component comp1")を呼び出すことを考えましたが、clangがこの呼び出しを定数文字列で最適化しているようです。

シャード私はfopen("@(#) Component comp1")と電話しますか?誰かがこの名前のファイルを作成すると、1つのファイル記述子が失われる可能性があります。これはうまくいくようですが、ちょっと残酷すぎるようです。

+0

可能性のある重複したすべての副作用あるんという関数を呼び出します16349557/gcc-have-any-options-to-add-version-info-in-elf-binary-file –

答えて

1

この宣言をグローバルスコープに移動すると、簡単にはOne Definition Ruleという違反につながる可能性があります。

volatileキーワードを使用して、これらの変数を最適化することを禁止できます。自動記憶域期間を持つ変数が初期化または副作用の デストラクタがある場合

[C++11: 3.7.3:]は、そのブロックの最後 前に破壊されてはならない、またそれは、さらにそれ 表示された場合、最適化として除去されなければなりません未使用であるためには、(...)

及び揮発性glvalueによって指定されたオブジェクトにアクセス

[C++11: 1.9.12:]

(3 0.10)、 オブジェクトを変更するライブラリI/O関数を呼び出す、または は、これらの操作のいずれかがhttp://stackoverflow.com/questions/の

+0

volatile charを教えてくださいstring_for_what [] = "@(#)Component comp1";または揮発性の文字列string_for_what( "@(#)Component comp1"); ?ありがとうございました – BOC

+0

@BOC私はchar配列を使用します。 –

関連する問題