Подтвердить что ты не робот

Использование макроса с ошибкой строки на 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
4b9b3361

Ответ 1

Так как С++ 11, пользовательские литералы существуют и являются частью предварительной обработки. Грамматика:

preprocessing-token:
    user-defined-string-literal
    // other stuff...

user-defined-string-literal:
    string_literal ud-suffix

ud-suffix:
    identifier

Итак, "("__DATE__ соответствует токере предварительной обработки, но "(" __DATE__ не является (это два отдельных токена предварительной обработки).

Замена макросов происходит после токенизации. Поскольку в первом примере нет токена __DATE__, замены нет.