Функциональный макрос, который возвращает ноль и может использоваться как оператор

У нас есть макрос функции #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.

7
задан AstroCB 2 November 2014 в 18:59
поделиться