Я пытаюсь создать макрос 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, это макрос, который может вызвать проблемы? Кроме того, есть ли способ увидеть макро-расширенный код?
Как это исправить?
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
может помочь.