なぜこれはコンパイルに失敗するのですか?
char programDate[] = "("__DATE__")";
しかし、これはうまくコンパイルされます(スペースを参照):
char programDate[] = "(" __DATE__")";
VC2015がリテラル演算子をサポートするようになったことは知っています。しかし、それはコンパイル段階ではないのですか? __DATE__
はプリプロセッサで処理されているはずです。ここで何が起こっているのですか?
Unicode/Unicode以外のビルドでのミックスマッチの問題について考えましたが、役に立ちません。これは、事前定義されたマクロだけでなく、ユーザー定義の問題でもあります。
#define MACRO "abc"
char data[] = "("MACRO")";
編集:
Error C3688 invalid literal suffix '__DATE__'; literal operator or literal operator template 'operator ""__DATE__' not found
C++ 11以降、ユーザー定義リテラルが存在し、前処理の一部です。文法は次のとおりです。
preprocessing-token:
user-defined-string-literal
// other stuff...
user-defined-string-literal:
string_literal ud-suffix
ud-suffix:
identifier
したがって、"("__DATE__
はpreprocessing-tokenに一致しますが、"("
__DATE__
は一致しません(2つの別個の前処理トークン)。
トークン化後にマクロの置換が行われます。最初の例ではトークン__DATE__
がないため、代替はありません。