Макроавтоматический аргумент без поддержки VARIADIC

У меня есть макрос с 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

Больше возможных обходных путей?

1

Решение

Предполагая, что это невозможно Чтобы использовать другой компилятор (что кажется сомнительным требованием, но давайте отложим это в сторону), вам наверняка понадобится другая функция для 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,

Если требуется безопасность потока, используйте хранилище, специфичное для потока, а не общее глобальное.

1

Другие решения


По вопросам рекламы ammmcru@yandex.ru
Adblock
detector