У нас есть макрос функции #define FOO(arg) foo(arg)
с int foo(const char* bar);
. Когда NDEBUG определен, FOO определяется как #define FOO(arg) 0
, однако это вызывает множество предупреждений компилятора, поскольку во многих случаях возвращаемое значение FOO не используется. Решение должно работать с компиляторами ANSI C и не вызывать предупреждений. Я пробовал:
(void)0
: не может быть присвоен переменной
static int foo(const char* bar) { return 0; }
: вызывает предупреждение о неиспользуемой статической функции в некоторых модулях
static inline int foo(const char* bar) { return 0; }
: работает только с компиляторами C99
Спасибо за помощь!
редактировать1:
Это чем-то похоже на макрос трассировки и используется во всем проекте. В основном это просто используется как выражение вроде FOO("вызвана функция x");
, но в некоторых случаях я видел if (FOO("условие a")) { /* еще немного отладки вывод */ }
. С определенным NDEBUG и включенной оптимизацией ничего не должно остаться от FOO. Это не я придумал, но я должен убрать этот беспорядок :).
edit2: я должен добавить, что для выпускных сборок gcc используются следующие флаги: -O3 -Wall -ansi
edit3: пока я использую __inline int dummy() { return 0; }
. __inline работает как с VisualC, так и с GCC в режиме ansi.