У меня есть код, который я поддерживаю, что начал компилировать под clang 3.3. При компиляции с «-std = C++ 11» clang генерирует ошибку (см. Ниже). Я дистиллированная вредоносный код, на следующее:Почему clang анализирует это как пользовательский литерал?
#include <stdio.h>
#define DBG_PRT(__format, ...) \
printf("%s:%d:%s: "__format, __FILE__, \
__LINE__, __FUNCTION__, ## __VA_ARGS__)
int main()
{
DBG_PRT("%s\n", "Hi");
}
Это лязг-х выход:
test.cpp:10:5: error: no matching literal operator for call to 'operator "" __format' with arguments of types 'const char *' and 'unsigned int'
DBG_PRT("%s\n", "Hi"); ^ test.cpp:4:29: note: expanded from macro 'DBG_PRT' printf("%s:%d:%s: "__format, __FILE__, \ ^1 error generated.
без пробелов между строкового литерала и «__format», это не похоже, препроцессора должен иметь возможность расширять __формат. Это ясно is, хотя, если не указывать -std = C++ 11. G ++ 4.4.7 (с и без -std = C++ 0x) компилируется просто отлично.
Есть ли ошибка с компилятором?
"__format" является зарезервированным идентификатором (двойной знак подчеркивания). Попробуйте другое имя. –
Поскольку '' "_' является синтаксисом для пользовательских строковых литералов. Поместите промежуток между ними, чтобы иметь старое поведение (конкатенатные литералы). GCC работает нормально, потому что 4.4.7 не реализует пользовательские литералы (он появился в 4.8, если мне нужна память). –
@ VladLazarenko: Думаю, вы должны повернуть свой комментарий к ответу + подсказку Фреда. – deepmax