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?

16
demandé sur unwind 2011-07-08 12:21:36

6 réponses

vous dites que vous utilisez XLib. Je ne peux que trouver deux places dans mon Xlib.hclass 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;
7
répondu mu is too short 2011-07-08 08:50:14

é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;
17
répondu wimh 2011-07-08 08:26:46

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".

14
répondu iammilind 2011-07-08 09:12:17

Class est un mot-clé réservé en C++ et ne peut pas être utilisé comme nom de variable. Vous devrez renommer la variable.

1
répondu RedX 2011-07-08 08:22:55

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-->

1
répondu Ajay 2011-07-08 08:31:02

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

0
répondu Louen 2011-07-08 08:32:29