2009-04-01 6 views
1

Je suis en train de déplacer un projet d'une ancienne plate-forme Linux vers un kubunutu 9.04. Maintenant, je reçois cette erreur lors de la compilation avec gcc 4.3.3:erreur de compilation: cpumask.h: "et" peut ne pas apparaître dans la liste des paramètres de macro

/usr/src/linux-headers-2.6.28-11-generic/include/linux/cpumask.h:600:37: error: "and" may not appear in macro parameter list 

Si je comprends bien le message, il ne peut pas utiliser « et » en tant que paramètre macro, car il est une « commande réservé ». Deux questions à ce sujet:

  1. Comment est-ce possible? Je ne peux pas imaginer qu'il y ait une telle erreur dans les fichiers d'en-tête de Linux ... Ai-je fait quelque chose de mal avant? J'ai essayé un #undef et mais cela n'aidera pas.
  2. Comment réparer cette erreur? Il ne peut pas être vrai que je dois changer les fichiers d'en-tête Linux, peut-il?

Merci pour votre aide.

+0

La chose que je fais est la suivante: j'inclure dans un .hpp fichier. Mais je ne fais pas d'autres trucs bizarres avant ça ... des idées? – Chris

+0

Merci les gars, à cause de vous, je comprends moins la raison de ceci: La macro définie dans cpumask.h ne répond pas aux restrictions du préprocesseur C++ car il s'agit d'une macro C. Mais je me demande toujours s'il existe une solution facile pour résoudre ce problème, ou suis-je le seul à vouloir inclure .h dans .cpp/.hpp? – Chris

Répondre

1

Je crois que le problème est que and est un keyword in C++ but not C (ils utilisent &&).

Les noyaux manquent parfois de macros comme alternative aux fonctions en ligne. Parfois, cependant, ils ont besoin de macros parce que ce qu'ils veulent faire doit être fait dans la portée de la fonction appelante, et la définition d'une fonction pour cela ne fonctionnera pas (par exemple une macro pour trouver le nom de la fonction courante). En supposant que les macros en question sont de fausses fonctions en ligne, il serait possible d'écrire votre propre fichier .c plein de rien d'autre que des fonctions appelant ces macros, de le compiler, et de se référer à ces fonctions via un en-tête extern "C". Vous auriez le même comportement, mais les performances sont légèrement moins bonnes (ce qui ne devrait pas poser de problème).

Si les macros doivent être réellement des macros, alors votre meilleur pari est de les éditer manuellement pour qu'elles soient conformes à C++.

1

Les en-têtes linux sont des en-têtes C, pas C++.

+0

Peut-être extern "C" va résoudre ce problème? –

+0

Non, il a gagné '- cela spécifie juste le lien, pas la syntaxe du langage. –

+0

Bien sûr, comme c'est stupide de ma part. La solution est de ne pas inclure le fichier. –

0

Il serait utile si vous avez également montré la ligne en question. Peut-être que tout est en contexte, si vous faites quelque chose de fou avant d'inclure l'en-tête, le compilateur peut être confus et générer un message d'erreur non évident.

Il y a des cas où « et » est en effet un mot réservé, et si elle est C++ - seuls les développeurs du noyau seront pas trop de soins, car le noyau se concentre sur C.