2013-08-05 2 views
2

У меня есть код, который я поддерживаю, что начал компилировать под 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) компилируется просто отлично.

Есть ли ошибка с компилятором?

+3

"__format" является зарезервированным идентификатором (двойной знак подчеркивания). Попробуйте другое имя. –

+7

Поскольку '' "_' является синтаксисом для пользовательских строковых литералов. Поместите промежуток между ними, чтобы иметь старое поведение (конкатенатные литералы). GCC работает нормально, потому что 4.4.7 не реализует пользовательские литералы (он появился в 4.8, если мне нужна память). –

+1

@ VladLazarenko: Думаю, вы должны повернуть свой комментарий к ответу + подсказку Фреда. – deepmax

ответ

6

Это потому, что "" _ является синтаксисом для пользовательских строковых литералов. Поместите промежуток между ними, чтобы иметь старое поведение (конкатенатные литералы). GCC работает нормально, поскольку 4.4.7 не реализует пользовательские литералы (it appeared in version 4.7).

Кроме того, как указывал @Fred, старайтесь избегать использования зарезервированного идентификатора (двойное подчеркивание).

+0

Ваша память - лжец, это было 4.7. – Casey

+0

@Casey: Исправлено, спасибо. –

Смежные вопросы