Проблемы конкатенации с макросом отладочной печати под gcc - PullRequest
0 голосов
/ 23 июня 2010

Чтобы полностью отключить отладочный вывод в 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) в качестве альтернативы.

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

Ответы [ 2 ]

2 голосов
/ 23 июня 2010

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

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

0 голосов
/ 23 июня 2010

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

...