c++ c struct naming-conventions

Conflicto de nombres en C++: cómo acceder a un miembro de estructura llamado "clase"



naming-conventions (6)

Dado que no puedo cambiar la estructura en sí, ¿cómo puedo acceder a este miembro de la estructura a pesar del conflicto de nombres?

Tal vez puedas cambiarle el nombre usando #define, algo como

#define class xclass #include "header.h" #undef class // ... myvariable = mystruct->xclass;

Me encontré con un problema de nombres mientras trabajaba con la biblioteca xlib:

Estoy usando una estructura que tiene un miembro llamado "clase". Supongo que esta biblioteca se utiliza principalmente en programas de C simple. Así que no hay problema.

Pero estoy programando en C ++ y aquí el nombre "clase" es una palabra clave y no se puede usar para denotar variables. Por lo tanto, si estoy accediendo a la estructura a través de

myvariable = mystruct->class;

Estoy recibiendo el error:

expected unqualified-id before ''class''

Dado que no puedo cambiar la estructura en sí, ¿cómo puedo acceder a este miembro de la estructura a pesar del conflicto de nombres?


Como class es una palabra clave en C ++, el compilador se quejará si lo usas

Tal vez podría crear una estructura "wrapper" (en C) que le permita acceder a su estructura defectuosa, algo como

typedef struct Wrapper_ { faultyStruct * mystruct ; faultyStructClass * cls ; } Wrapper ; Wrapper wrap(faultyStruct * s) { Wrapper w = {s, &(s->class) } ; }

Compile este archivo con su compilador de C y utilícelo en su código C ++ a través de extern "C"

También puede usar el preprocesador para redefinir la class (pero no estoy seguro si es legal #definar las palabras clave de C ++


En VC ++, puede usar la palabra clave de la extensión de Microsoft: __identifier

int __identifier(float); __identifier(float) = 10.4f;

MSDN dice que es aplicable solo para / clr (Managed C ++), pero eso no es cierto. Existió incluso en VC6.


La clase es una palabra clave reservada en C ++ y no se puede utilizar como nombre de variable. Tendrás que renombrar la variable.


Usted dice que está utilizando XLib. Solo puedo encontrar dos lugares en mi Xlib.h donde se usa la class como miembro de la estructura: Visual y XWindowAttributes . En ambos casos, el miembro infractor se envuelve así:

#if defined(__cplusplus) || defined(c_plusplus) int c_class; #else int class; #endif

Aparece una XColormapEvent similar en XColormapEvent para encargarse del new miembro.

Por lo tanto, debería estar bien a menos que su compilador de C ++ no esté definiendo ninguna de las macros necesarias; pero eso también rompería las envolturas extern "C" { ... } habituales, por lo que el problema es más probable en otro lugar. Si está utilizando una estructura que no es parte del estándar XLib, debe aplicar el truco anterior a mano y tener una discusión seria con el autor de la biblioteca (y si ese es usted, entonces, enojado, háblese un poco y nosotros '' pretenderé no escuchar).

Si tiene problemas con las estructuras XLib, intente usar la versión C ++ de los nombres de los miembros:

myvariable = mystruct->c_class; mynew = ev->c_new;


class es una palabra clave en C ++. No puedes usarlo como una variable.

Si desea seguir accediendo a él, puede codificar esa parte en C y luego compilarla con el compilador c:

typedef struct foo { bar class; } foo; bar *getClassPtr(foo *p) { return &(p->class); }

Incluye esa parte en tu código C ++ usando,

extern "C" { bar *getClassPtr(foo *); } bar &getClass(foo &s) { return *getClassPtr(&s); }

También es posible que desee versiones const.

Aún no puede incluir la definición de estructura en su código C ++, por lo que puede que tenga que envolver a los otros miembros de foo de la misma manera. A menos que la optimización del tiempo de enlace pueda getClassPtr línea, hay una sobrecarga en la llamada, en comparación con el acceso al miembro de la estructura directamente desde C ++. Normalmente esto será despreciable, pero vale la pena conocerlo.

Es posible que desee encontrar información sobre extern "C" .