Предупреждение GCC: ISO C не разрешает именованные переменные макросы - PullRequest
10 голосов
/ 19 июля 2011

Используя следующую команду

gcc -c -Wall -Wextra -pedantic -ansi -std=c99 -fstack-protector-all -fstack-check -O3 root.c -o  rootTESTOBJECT

Я получаю предупреждение компилятора root.h: 76: 22: предупреждение: ISO C не разрешает именованные переменные макросы

72 #ifdef Debug
73 #include <stdio.h>
74 #define crumb(phrase0...) printf(phrase0)
75 #else
76 #define crumb(phrase0...) 
77 #endif

Я считаю, что вариант -ansi -std = c99 позволяет использовать макросы типа variadic, в любом случае, согласно документам ...

Я попытался отредактировать строку 76 до

76 #define crumb(phrase0...) printf("")

чтобы увидеть, исправило ли это предупреждение, но без радости.

компилятором является gcc от Apple, версия 4.2.1 Я не уверен, что мне нужно быть слишком обеспокоенным этим, но я действительно не люблю предупреждения. Какой флаг мне не хватает?

1 Ответ

20 голосов
/ 20 июля 2011

#define crumb(phrase0...) <whatever> присваивает имя (phrase0) аргументам переменной (...).

Это расширение GCC .

C99 действительно определяет способ передачи переменных аргументов в макросы (см. §6.10.3 / 12 и §6.10.3.1 / 2): переменные аргументы не называются в левой части определений (то есть просто...) и обозначается с правой стороны как __VA_ARGS__, например:

#define crumb(...) printf(__VA_ARGS__)

(Кстати, ваши аргументы gcc не должны включать в себя -ansi и -std=c99: -ansi указывает более ранний стандарт C (известный также как ANSI C, C89 или C90); комбинация обоих вариантов в данном случае происходит только для выбора C99, поскольку -std=c99 появляется после -ansiв списке аргументов, и последний выигрывает.)

...