VC 2015 年将宏与字符串一起使用失败

Using macro with string fails on VC 2015

为什么编译失败?

char programDate[] = "("__DATE__")";

但这编译得很好(参见 space):

char programDate[] = "(" __DATE__")";

我知道 VC2015 现在支持文字运算符。但那不应该在编译阶段吗? __DATE__ 应该已经被预处理器处理过。这是怎么回事?

我想到了 Unicode/non-Unicode build 的一些混合匹配问题 - 但它没有帮助。这不仅仅是预定义宏的问题,还有用户定义的问题:

#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__ 不匹配(即两个单独的预处理令牌)。

宏替换发生在标记化之后。由于您的第一个示例中没有令牌 __DATE__ ,因此没有替代品。