У меня есть макрос с varargs, который автоматически вводит некоторые аргументы, как первый ниже, вводящий аргумент «__FNAME__
«:
#ifdef VERBOSE
#define logdbg(format, ...) debugff(__FNAME__, format, ##__VA_ARGS__)
#elif defined(NORMAL)
#define logdbg(format, ...) debugf(format, ##__VA_ARGS__)
#else
#define logdbg(format, ...) /* debud off */
#endif
Но мне нужно, чтобы этот макрос работал с компиляторами без поддержки MACRO VARIADIC (в SCO Unix и AIX 4.3 Copmiler v3).
В этих средах у меня сейчас:
#ifdef VERBOSE
#define logdbg debugff(__FNAME__, format, ##__VA_ARGS__)
#elif defined(NORMAL)
#define logdbg debugf
#else
#define logdbg if(1);else debugf
#endif
Эти компиляторы не приняли комментарий в последнем определении макроса, и я получаю if(1);else blablabla
это прекрасно работает от https://stackoverflow.com/a/687412/926064
Но мне нужно еще решение первого случая, когда аргумент «вводится» макросом.
Какой-то обходной путь для этого?
РЕДАКТИРОВАТЬ:
Поскольку это не программное обеспечение с поддержкой многопоточности, я подумываю изменить «инфраструктуру» отладки, чтобы вводить аргументы, используя побочные функции для установки значений в переменных «контекста» (глобальных, статических и т. Д.):
#define logdbg pass_args(__FNAME__); debugf
Больше возможных обходных путей?
Предполагая, что это невозможно Чтобы использовать другой компилятор (что кажется сомнительным требованием, но давайте отложим это в сторону), вам наверняка понадобится другая функция для logdbg
расширить в. Вероятно, эта функция будет принимать __FNAME__
аргумент из другого источника, как глобальная переменная.
#define logdbg ((logdbg_fname__ = __FNAME__), debugff_broken)
void debugff_broken(const char *fmt, ...) {
extern const char *logdbg_fname__;
va_list ap;
va_start(ap, fmt);
vdebugff(logdbg_fname__, fmt, ap);
va_end(ap);
}
куда vdebugff
как debugff
кроме того, что требуется va_list
,
Если требуется безопасность потока, используйте хранилище, специфичное для потока, а не общее глобальное.