2012-01-04 8 views
6

Я хочу, чтобы иметь макрос, который вызывается так:Как реализовать макрос, который создает строку с кавычками для _Pragma?

GCC_WARNING(-Wuninitialized) 

, которая расширяется до кода:

_Pragma("GCC diagnostic ignored \"-Wuninitialized\"") 

Я не имеющий повез получить эту работу, как обычные уловки препроцессор присоединяется и стягивается, похоже, не применяется, или я не знаю, как их применять здесь.

+0

Это была опечатка, не так ли? –

ответ

0

Было бы также приемлемо, если аргумент макроса заключен в одинарные кавычки? Если да, то вы могли бы использовать это:

#define GCC_WARNING(x) _Pragma("GCC diagnostic ignored '" #x "'") 

При вызове его как GCC_WARNING(-Wuninitialized) расширяется до

_Pragma("GCC diagnostic ignored '" "-Wuninitialized" "'") 

мне пришлось использовать строки конкатенации поведение C (printf("a" "b"); такое же, как printf("ab");) здесь, так как использование "'#x'" в макросе позволит избежать расширения x.

+0

Почти ... на самом деле «_Pragma» имеет особое значение для gcc. Я отправлял аналогичное решение, но понял, что он не работает с моим gcc, потому что препроцессор жалуется («error: _Pragma принимает строковый литерал в скобках»). –

+1

Это не сработает - '_Pragma' интерпретирует свой аргумент до того, как строки конкатенированы, поэтому он увидит две строки, а не одну. В отличие от 'printf', это специальная конструкция, которая следует специальным правилам. – Lindydancer

+0

Ах, как глупо, мне не приходило в голову, что это вопрос, специфичный для GCC. Я думал, что '_Pragma' - это некоторая функция отладки, но теперь, когда я смотрю на имя макроса, мне следовало бы знать лучше. –

14

С небольшой помощью препроцессора магии:

#define HELPER0(x) #x 
#define HELPER1(x) HELPER0(GCC diagnostic ignored x) 
#define HELPER2(y) HELPER1(#y) 
#define GCC_WARNING(x) _Pragma(HELPER2(x)) 

GCC_WARNING(-Wuninitialized) 
+0

Спасибо, но это не работает, возможно, из-за того, что он не помещается \ "вокруг -Wuninitialized. Использование макросов выше дает следующую ошибку GCC: игнорирование #pragma GCC-диагностики [-Wunknown-pragmas] – ThreeBit

+0

Он помещает цитаты вокруг -Унициализирован. Проблема заключалась в типовой «диагностике» вместо «диагностики» - я исправил ее в ответе выше. – Lindydancer

+1

вы спасаете мою жизнь – MoLice