Расширение макроса внутри макроса

0

Я пытаюсь создать макрос LOGDEBUG:

#ifdef DEBUG
#define DEBUG_TEST 1
#else
#define DEBUG_TEST 0
#endif

#define LOGDEBUG(...) do { if (DEBUG_TEST) syslog(LOG_MAKEPRI(LOG_SYSLOG, LOG_DEBUG),  __VA_ARGS__); } while (0)

...

size_t haystack_len = fminl(max_haystack_len, strlen(haystack_start));
LOGDEBUG(("haystack_len %ld\n", haystack_len));

Я не использую параметры # или ## для подкрепления аргументов, и все же g++, по-видимому, пытается их укрепить:

numexpr/interpreter.cpp:534:5: error: invalid conversion from ‘size_t {aka long unsigned int} to ‘const char* [-fpermissive]

Обратите внимание, что haystack_len - size_t и я не преобразовываю его в char* в макрос, но компилятор видит его как таковой. g++ неявно пытается преобразовать макросы в строки?

Как это исправить? Я имею в виду, я использую макрос gnu LOG_MAKEPRI для syslogging, это макрос, который может вызвать проблемы? Кроме того, есть ли способ увидеть макро-расширенный код?

  • 0
    Я думаю, у вас есть 2 дополнительные скобки в вызове LOGDEBUG. (вы передаете только 1 аргумент)
Теги:
macros
variadic-macros

1 ответ

1
Лучший ответ

Как это исправить?

LOGDEBUG(("haystack_len %ld\n", haystack_len)); вызовите макрос одним уникальным аргументом. Поэтому он будет производить:

do { if (DEBUG_TEST) syslog(LOG_MAKEPRI(LOG_SYSLOG, LOG_DEBUG), ("haystack_len %ld\n", haystack_len)); } while (0);

И ("haystack_len %ld\n", haystack_len) используют запятую и приводят к haystack_len

Поэтому вы должны называть это так: LOGDEBUG("haystack_len %ld\n", haystack_len);

Кроме того, есть ли способ увидеть макрокоманду -E xpanded?

gcc -E может помочь.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню