Можно ли использовать __func__ в gcc 3.3+ по-старому? (C ++) - PullRequest
4 голосов
/ 27 августа 2009

В версиях gcc до 3.3 и компиляторе MS я использую следующий макрос:

DEBUG_WARNING(...) printf(">WARNING: "__FUNCTION__"() " __VA_ARGS__);

Использование:

DEBUG_WARNING("someFunction returned %d", ret); 

Выход:

>WARNING: Class::FunctionName() someFunction returned -1

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

Поскольку определение __FUNCTION____func__ в C ++) изменилось (я полагаю, что для соответствия стандартам) оно также сделало этот макрос неработоспособным.

У меня все работает, используя функцию, которая создает строку вручную, но мне нравится мой макрос.

Мне не хватает простого способа заставить этот простой однострочный макрос работать под Gcc 3.3?

: D

1 Ответ

5 голосов
/ 27 августа 2009

Поскольку __FUNCTION__ и __func__ - это предопределенный идентификатор, а не строковый литерал, его нельзя использовать в конкатенации строкового литерала препроцессора. Но вы можете использовать его в формате printf. Также обратите внимание на использование ##args вместо __VA_ARGS__ для использования переменных аргументов макроса в стиле GNU для решения проблемы с запятой между __func__ и, возможно, нулевыми аргументами.

#define DEBUG_WARNING(fmt, args...) \
  printf(">WARNING: %s() " fmt "\n", __func__, ##args)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...