Как реализовать макрос, который создает строку в кавычках для _Pragma? - PullRequest
6 голосов
/ 04 января 2012

Я хочу иметь макрос, который вызывается так:

GCC_WARNING(-Wuninitialized)

, который расширяется до кода, подобного следующему:

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

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

Ответы [ 2 ]

15 голосов
/ 04 января 2012

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

#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 голосов
/ 04 января 2012

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

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

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

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

Мне пришлось использовать конкатенацию строки C (*Здесь значение 1008 * совпадает с printf("ab");), поскольку использование "'#x'" в макросе позволит избежать расширения x.

...