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__
,因此没有替代品。
为什么编译失败?
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__
,因此没有替代品。