2010-05-15 16 views
10

J'ai du mal à écrire du code C++ utilisant un fichier d'en-tête conçu pour un fichier C. En particulier, le fichier d'en-tête utilisé un nom de variable classe appelée:Utilisez le mot-clé class comme nom de variable en C++

int BPY_class_validate(const char *class_type, PyObject *class, PyObject *base_class, BPY_class_attr_check* class_attrs, PyObject **py_class_attrs); 

Cela fonctionne en C comme classe n'est pas considérée comme un mot-clé, mais en C++, la classe est. Donc, est-ce que je peux # inclure ce fichier d'en-tête dans un fichier C++, ou est-ce que je n'ai pas de chance?

Merci.

+0

Si ce code n'est pas préparé pour être analysé par un compilateur C++, préparez-vous à plus de problèmes. Par exemple, s'il s'agit d'un C lib avec lequel vous voulez vous lier, toutes les déclarations doivent être encapsulées dans 'extern" C "' de sorte que l'éditeur de liens sache qu'il doit rechercher des symboles non mélangés. – sbi

+0

Le compilateur lance quand même un ajustement quand je viens d'enrouler le #include dans un "C" externe. Dois-je inclure le tour d'aaa dans le vôtre? –

+0

Je viens de réaliser qu'il s'agit d'un en-tête Python. Je n'ai aucune idée de l'en-tête que vous utilisez et de son utilisation, mais connaissez-vous http://www.boost.org/doc/libs/1_43_0/libs/python/doc/index.html? – sbi

Répondre

9

essayer quelque chose comme ceci:

#define class class_variable 
// if class is only used in declarations, you can also do 
// #define class 
#include "c.h" 
#undef class 

il peut causer des problèmes, mais peut-être vaut le coup

alternatif (en utilisant Makefile):

python_.hpp: /usr/include/python.h 
    perl -pe 's/\Wclass\W//g' $< > [email protected] 
... 

#include "python_.hpp" 
+0

Ça a marché ... même si je n'ai pas encore lié les bibliothèques, merci. –

+0

@Leif bonne chance.Peut également vouloir inspecter manuellement le fichier prétraité, assurez-vous qu'aucun effet secondaire indésirable n'a été introduit – Anycorn

+1

Si vous utilisez l'un des en-têtes de bibliothèque standard, la définition d'une macro avec un mot clé comme nom n'est pas autorisée (cf http: // stackoverflow .com/questions/2726204/c-préprocesseur-définir-un-mot-clé-est-ce-conforme aux normes). C est un peu plus clément que C++ à cet égard. –

3

Vous pouvez toujours utiliser #ifdef __cplusplus pour créer une déclaration spécifique pour C++ dans cet en-tête

+0

Étant donné que cela fait partie d'un référentiel de code plus grand, je ne devrais probablement pas être dans le fichier d'en-tête lui-même. –

3

Vous devrez modifier l'en-tête pour remplacer « classe » avec quelque chose d'autre afin de le compiler en C++.

1

En pratique, vous re de la chance. "class" est un mot réservé , vous ne pouvez pas l'utiliser comme identificateur de variable.

Je suppose que vous pouvez faire des tours de préprocesseur, comme

#define class othername 

Mais c'est vraiment idiot, parce que ça va rendre votre code source de confusion et vous empêcher d'utiliser des classes réelles.

Mordez la balle et renommez le paramètre "theclass" ou quelque chose comme ça.

7

S'il s'agit d'une déclaration uniquement, les noms de variable n'ont aucune importance. Vous pouvez les supprimer complètement ou les changer à votre guise. En effet, la déclaration définit simplement le nom et le type de la fonction, qui est:

int BPY_class_validate(const char *, PyObject *, PyObject *, 
         BPY_class_attr_check*, PyObject **); 

Mais si vous voulez que les noms (soit un peu plus descriptif), vous pouvez simplement jeter un trait de soulignement à la fin de ce que vous avez:

int BPY_class_validate(const char *class_type, PyObject *class_, 
         PyObject *base_class, BPY_class_attr_check* class_attrs, 
         PyObject **py_class_attrs); 

Ceci ne casse aucun autre code.