web-dev-qa-db-ja.com

文字列でマクロを使用すると、VC 2015で失敗します

なぜこれはコンパイルに失敗するのですか?

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
15
Ajay

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__がないため、代替はありません。

21
M.M