Nommer le conflit en C++: comment accéder à un membre de struct appelé " class"
j'ai rencontré un problème de nom en travaillant avec la bibliothèque xlib:
j'utilise une structure qui a un membre appelé "class". Je suppose que cette bibliothèque est principalement utilisée dans les programmes en C. Donc il n'y a pas de problème.
mais je programme en C++ et ici le nom "class" est un mot-clé et ne peut pas être utilisé pour dénoter des variables. Donc, si j'accède à la structure via
myvariable = mystruct->class;
je suis de l' erreur:
expected unqualified-id before ‘class’
étant donné que je ne peux pas changer la structure elle-même, comment puis-je accéder à ce membre de la structure malgré le conflit de noms?
6 réponses
vous dites que vous utilisez XLib. Je ne peux que trouver deux places dans mon Xlib.h
où class
est utilisé comme membre de structure:Visual
et XWindowAttributes
. Dans les deux cas, le membre fautif est enveloppé comme ceci:
#if defined(__cplusplus) || defined(c_plusplus)
int c_class;
#else
int class;
#endif
Similaire hackery apparaît dans XColormapEvent
pour prendre soin de l' new
membre.
vous devriez donc vous en sortir à moins que votre compilateur C++ ne définisse aucune des macros nécessaires; mais cela briserait aussi l'habituel extern "C" { ... }
wrappers ainsi que le problème est probablement ailleurs. Si vous utilisez une structure qui ne fait pas partie de la norme XLib alors vous devriez appliquer le hack ci-dessus à la main et avoir une discussion sévère avec l'auteur de la bibliothèque (et si c'est vous, parlez-en avec colère à vous-même un peu et nous ferons semblant de ne pas écouter).
si vous avez des problèmes avec les structures XLib, alors essayez d'utiliser la version C++ des noms de membres:
myvariable = mystruct->c_class;
mynew = ev->c_new;
étant donné que je ne peux pas changer la structure elle-même, comment puis-je accéder à ce membre de la structure malgré le conflit de noms?
peut-être que vous pouvez le renommer en utilisant un #define, quelque chose comme
#define class xclass
#include "header.h"
#undef class
// ...
myvariable = mystruct->xclass;
class
est un mot-clé en C++. Vous ne pouvez pas l'utiliser comme variable.
Si vous voulez toujours y avoir accès que vous pouvez le code de la partie C, puis le compiler avec le compilateur c:
typedef struct foo {
bar class;
} foo;
bar *getClassPtr(foo *p) { return &(p->class); }
incluez cette partie dans votre code C++ en utilisant,
extern "C" {
bar *getClassPtr(foo *);
}
bar &getClass(foo &s) { return *getClassPtr(&s); }
vous pourriez aussi vouloir des versions const.
vous ne pouvez toujours pas inclure la définition de struct dans votre code C++, donc vous devrez peut-être envelopper les autres membres de foo
de la même manière. À moins que le temps de liaison l'optimisation peut inline getClassPtr
, il y a quelques frais généraux dans l'appel, comparé à l'accès au membre struct directement à partir de C++. Normalement, ce sera négligeable, mais il vaut la peine de connaître.
Vous pouvez trouver des informations au sujet extern "C".
Class est un mot-clé réservé en C++ et ne peut pas être utilisé comme nom de variable. Vous devrez renommer la variable.
Dans VC++, vous pouvez utiliser Microsoft extension de mot-clé: __identificateur
int __identifier(float);
__identifier(float) = 10.4f;
MSDN dit qu'il est applicable pour /clr (Managed C++) seulement, mais ce n'est pas vrai. Il existait même en VC6!--4-->
class
est un mot-clé en C++, le compilateur se plaindra si vous l'utilisez
peut-être que vous pourriez créer une structure "wrapper" (en C) qui permet d'accéder à votre structure défectueuse, quelque chose comme
typedef struct Wrapper_ {
faultyStruct * mystruct ;
faultyStructClass * cls ;
} Wrapper ;
Wrapper wrap(faultyStruct * s) {
Wrapper w = {s, &(s->class) } ;
}
compilez ce fichier avec votre compilateur C et utilisez-le dans votre code C++ par extern "C"
vous pouvez également utiliser le préprocesseur pour redéfinir class
(mais je ne suis pas sûr qu'il soit légal de # define c++ keywords