Использование макроса с ошибкой строки на VC 2015
Почему это не удается скомпилировать?
char programDate[] = "("__DATE__")";
Но это компилируется отлично (см. пробел):
char programDate[] = "(" __DATE__")";
Я знаю, что VC2015 теперь поддерживает литеральные операторы. Но разве это не должно быть на этапе компиляции? __DATE__
должен быть обработан препроцессором. Что здесь происходит?
Я подумал о проблеме с сочетанием совпадений с сборкой Unicode/non-Unicode, но это не помогает. Это не просто проблема с предопределенными макросами, но и с определением пользователя:
#define MACRO "abc"
char data[] = "("MACRO")";
EDIT:
Error C3688 invalid literal suffix '__DATE__'; literal operator or literal operator template 'operator ""__DATE__' not found
Ответы
Ответ 1
Так как С++ 11, пользовательские литералы существуют и являются частью предварительной обработки. Грамматика:
preprocessing-token:
user-defined-string-literal
// other stuff...
user-defined-string-literal:
string_literal ud-suffix
ud-suffix:
identifier
Итак, "("__DATE__
соответствует токере предварительной обработки, но "("
__DATE__
не является (это два отдельных токена предварительной обработки).
Замена макросов происходит после токенизации. Поскольку в первом примере нет токена __DATE__
, замены нет.