Проблемы конкатенации с макросом отладочной печати в gcc

Чтобы полностью отключить вывод отладки в c-source, я обычно определяю следующий ПРОСТОЙ макрос #1

#define dprintf(args)

Чтобы включить отладочный вывод, я альтернативно определяю макрос № 2

#define dprintf(args) printk##args

Использование в источнике выглядит так:

dprintf(("Irqs:%lu\n",irqs));

Препроцессор должен создать следующую строку, если я использую макрос № 2

printk("Irqs:%lu\n",irqs);

Под Windows Visual C++ проблем нет.

Используя gcc версии 4.4.1 (Ubuntu 4.4.1-4ubuntu9) в NETBEANS IDE 6.8, я получил следующее сообщение об ошибке:

"printk" and "(" does not give a valid preprocessing token

Я попробовал следующее под Linux

#define dprintk(args...) printk(args)

Это работает только с dprintf("Irqs:%lu\n",irqs);

Однако Visual C++ не знает args...

Мне приходится попеременно компилировать исходный код на платформах Windows и Linux(386).

У кого-нибудь есть идея?


person Yves Ferrant    schedule 23.06.2010    source источник


Ответы (2)


Почему не #define dprintf(args) print args ?

Двойная скобка могла быть добавлена ​​для замены вариативного макроса в Visual C++: препроцессор будет обрабатывать вызов макроса, как если бы был только один параметр.

person philant    schedule 23.06.2010

Оператор вставки токенов ## можно использовать только для объединения токенов, как следует из его названия. Некоторые компиляторы, например. более новые версии gcc, применяйте это более жестко, чем другие, как вы теперь обнаружили. Однако, как говорит philippe, в этом конкретном примере вам не нужно ##.

person Paul R    schedule 23.06.2010