一部のコードをGCC4.7(4.6から)に移行し、いくつかのコンパイラエラーが発生し、GCC4.7移植ガイドに記載されている問題を見つけました。
ユーザー定義のリテラルと空白
ISOC11モードのC++コンパイラは
std={c++11,c++0x,gnu++11,gnu++0x}
、一部の有効なISO C++03コードと互換性のないユーザー定義リテラルをサポートしています。特に、文字列リテラルの後、有効なユーザー定義リテラルになる可能性のあるものの前に空白が必要になりました。有効なISOC++03コードを取得します
const char *p = "foobar"__TIME__;
C ++ 03では、TIMEマクロはある文字列リテラルに展開され、他の文字列と連結されます。C ++ 11
__TIME__
では拡張されておらず、代わりoperator "" __TIME__
に検索されているため、次の診断が行われます。error: unable to find string literal operator ‘operator"" __TIME__’
これは、空白なしでマクロが続くすべての文字列リテラルに適用されます。修正するには、文字列リテラルとマクロ名の間に空白を追加するだけです。
エラーを修正することはできますが、なぜこれを実行する必要があるのかを知りたいのです。__TIME__
はマクロであるため、前処理段階で(または同様の)に"something"__TIME__
変更される"something""15:52:03"
ため、コンパイラはそれをとして見る機会がありませんoperator ""
。
この動作は標準で承認されていますか、それともバグですか?