2016-12-21 4 views
2

__DATE__または__TIME__をヘッダファイルに使用する場合、そのヘッダ組み込み用のプリプロセッサの結果は多少異なる場合があります。`__DATE__`または` __TIME__`を使用してone-definition-ruleに違反していませんか?

ヘッダーファイル内で__DATE__または__TIME__を使用すると、1つの定義ルールに違反することがありますか?

フォローアップ:assertヘッダーがone-definition-ruleに違反していますか?

答えて

4

__TIME__が異なる翻訳単位で異なる結果を示す場合、翻訳単位全体で同じ結果が必要なコンテキストでは使用しないでください。これは、例えばを意味する。オブジェクト(例えば、クラスメンバ)を__TIME__に初期化する。この初期化子は、複数の翻訳単位に含まれるヘッダの一部であり、問​​題になる。

__DATE__は、新しくビルドを開始した場合でも、異なるビルドを開始した場合でも、異なる変換結果に対して異なる結果をもたらす可能性は低くなりますが、変更されたファイルのみを再コンパイルする場合は問題あります。

assert

NDEBUGは、そのヘッダが含まれていたときに定義された方法に応じて異なる展開されるマクロであるため、全体のプロジェクトのいずれかが NDEBUGが定義されなければならない、またはヘッダに定義された関数は assertの使用を避ける必要があるかどうかに同意しなければなりません。

0

1つの定義ルールは、変数、関数、クラスタイプ、列挙型またはテンプレート(セクション3.2、ISO/IEC 14882、1998 C++標準など)にのみ適用できます。 __DATE__または__TIME__は両方とも、文字列リテラルに展開される定義済みマクロです。これは、1つの定義ルールが適用されるものの1つではありません。

assert()もプリプロセッサマクロです。その拡張が変数、関数、クラス型、列挙型、またはテンプレートを定義する場合、その定義が翻訳単位間で異なる場合、その使用は潜在的に1定義規則に違反する可能性があります。実用的には、実装がそのような定義に拡張されたassert()マクロを持つ状況を想定することは困難です。

関連する問題