2010-06-23 7 views
0

Pour désactiver complètement une sortie de débogage dans c-source je définis habituellement les éléments suivants SIMPLE macro # 1problèmes de concaténation avec débogage impression macro sous gcc

#define dprintf(args)

Pour activer une sortie de débogage, je définis macro # 2 alternativement

#define dprintf(args) printk##args

L'utilisation dans la source ressemble à:

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

Un préprocesseur devrait créer la ligne suivante si j'utilise macro # 2

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

Sous Windows Visual C++, il n'y a pas de problème.

En utilisant la version gcc 4.4.1 (Ubuntu 4.4.1-4ubuntu9) sous NetBeans IDE 6.8, je reçu le message d'erreur suivant:

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

J'ai essayé les éléments suivants sous Linux

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

Cela fonctionne uniquement avec dprintf("Irqs:%lu\n",irqs);

Visual C++ ne sait pas cependant args...

Je dois compiler le code source sur Windows et la plate-forme Linux (386) alternativement.

Est-ce que quelqu'un a une idée?

Répondre

2

Pourquoi pas #define dprintf(args) print args?

La double parenthèse aurait pu être ajoutée pour remplacer la macro variadique en C++ visuel: le préprocesseur gèrera l'appel de macro comme s'il n'y avait qu'un seul paramètre.

0

L'opérateur de collage jeton ## ne peut être utilisé pour concaténer jetons, comme son nom l'indique. Certains compilateurs, par ex. les nouvelles versions de gcc, appliquent ceci plus rigidement que d'autres, comme vous l'avez maintenant découvert. Comme le dit philippe, cependant, vous n'avez pas réellement besoin de ## dans cet exemple particulier.

Questions connexes