Макросы препроцессора: как вставить аргументы? - PullRequest
1 голос
/ 02 января 2011

Код имеет ряд следующих разделов:

int filter;
#ifdef INPUTFILTER_FOO
 LOG4CXX_DEBUG(log, "FOO filter used");
         filter = F_FOO;
#endif

Они используются в коде несколько раз (используются для обеспечения ввода-вывода, поддержки потоков и т. Д. Для всех тестируемых конфигураций). Приблизительно они необходимы для отладки, но делают код грубым, хотят заменить их макросами, один для пространство имен для каждого типа.

Итак, хотим расширить следующее:

MACROSTUFFBAZ(log2, stuff, "BAZ") <- текстовая часть уникальна для каждого класса, поэтому ее также необходимо включить в макрос. </p>

до:

#ifdef INPUTSTUFF_BAZ
  LOG4CXX_DEBUG(log2, "BAZ stuff used");
  stuff = S_BAZ;
#endif

Чтобы определить макросы, планируйте использовать это:

debug.hpp:

   #ifdef INPUTSTUFF_BAZ
    #define MACROSTUFFBAZ ...
   #else
   #define MACROSTUFFBAZ
    .. no code!
   #endif
  #endif

(по крайней мере, это даст четкий обзор вещей, которые в настоящее время проходят испытательный срок, не видя их в коде)

1 Ответ

3 голосов
/ 02 января 2011

Вот моя попытка, хотя я не уверен на 100%, работает ли она, потому что я не могу проверить ее прямо сейчас, а также разные компиляторы обрабатывают макросы препроцессора немного по-разному.Но я думаю, что-то вроде этого работает, по крайней мере, в Visual Studio.

По сути, вам нужно использовать вспомогательный макрос для преобразования параметра в строку.А во-вторых, вы можете использовать ## для объединения идентификаторов:

#define PRMTOSTR_HLPR(x) #x
#define PRMTOSTR(x) PRMTOSTR_HLPR(x)

#ifdef INPUTSTUFF_BAZ
  #define MACROSTUFFBAZ(A,B,C) \
  LOG4CXX_DEBUG(A, PRMTOSTR(C)" stuff used"); \
  B = S_##C;
#else
  #define MACROSTUFFBAZ(A,B,C)
#endif

//used like this:
MACROSTUFFBAZ(log2, stuff, BAZ)

edit: Вспомогательный макрос здесь на самом деле не нужен, поэтому вы можете просто поместить #C прямо вопределение MACROSTUFFBAZ.

...