Конфликт именования в С++: как получить доступ к элементу структуры, называемому классом,
Я столкнулся с проблемой именования при работе с библиотекой xlib:
Я использую struct, у которого есть член, называемый "class". Я предполагаю, что эта библиотека в основном используется в простых программах на C. Поэтому проблем нет.
Но я программирую на С++, и здесь имя "класс" является ключевым словом и не может использоваться для обозначения переменных. Итак, если я получаю доступ к структуре через
myvariable = mystruct->class;
Я получаю сообщение об ошибке:
expected unqualified-id before ‘class’
Учитывая, что я не могу самостоятельно изменить структуру, как я могу получить доступ к этому члену структуры, несмотря на конфликт имен?
Ответы
Ответ 1
Вы говорите, что используете XLib. Я могу найти только два места в Xlib.h
, где class
используется как член структуры: Visual
и XWindowAttributes
. В обоих случаях оскорбительный член обернут следующим образом:
#if defined(__cplusplus) || defined(c_plusplus)
int c_class;
#else
int class;
#endif
Подобный хакер появляется в XColormapEvent
, чтобы заботиться о члене new
.
Итак, вы должны быть в порядке, если ваш компилятор С++ не определяет какой-либо из необходимых макросов; но это также нарушит обычные обертки extern "C" { ... }
, так что проблема, скорее всего, будет в другом месте. Если вы используете структуру, не являющуюся частью стандартного XLib, тогда вы должны применить вышеупомянутый взлом вручную и провести строгую дискуссию с автором библиотеки (и если вы тогда сердито поговорите с самим собой немного, я притворяюсь, что не слушаю).
Если у вас возникли проблемы с структурами XLib, попробуйте использовать версии имен на С++:
myvariable = mystruct->c_class;
mynew = ev->c_new;
Ответ 2
Учитывая, что я не могу самостоятельно изменить структуру, как я могу получить доступ к этому члену структуры, несмотря на конфликт имен?
Возможно, вы можете переименовать его с помощью #define, что-то вроде
#define class xclass
#include "header.h"
#undef class
// ...
myvariable = mystruct->xclass;
Ответ 3
class
- это ключевое слово в С++. Вы не можете использовать его как переменную.
Если вы хотите получить к нему доступ, чем вы можете закодировать эту часть на C, а затем скомпилировать ее с помощью компилятора c:
typedef struct foo {
bar class;
} foo;
bar *getClassPtr(foo *p) { return &(p->class); }
Включите эту часть в свой код на С++, используя
extern "C" {
bar *getClassPtr(foo *);
}
bar &getClass(foo &s) { return *getClassPtr(&s); }
Вам также могут понадобиться версии const.
Вы все еще не можете включить определение структуры в свой код на С++, так что вам, возможно, придется обернуть другие члены foo
таким же образом. Если оптимизация времени соединения не может встроить getClassPtr
, в вызове есть некоторые накладные расходы, по сравнению с доступом к элементу struct непосредственно из С++. Обычно это будет незначительно, но об этом стоит знать.
Вы можете найти информацию о extern "C" .
Ответ 4
Класс является зарезервированным ключевым словом в С++ и не может использоваться как имя переменной. Вам нужно будет переименовать переменную.
Ответ 5
В VС++ вы можете использовать ключевое слово Microsoft extension: __ identifier
int __identifier(float);
__identifier(float) = 10.4f;
MSDN говорит, что он применим только для /clr (Managed С++), но это не так. Он существовал даже в VC6
Ответ 6
Поскольку class
- это ключевое слово в С++, компилятор будет жаловаться, если вы его используете
Возможно, вы могли бы создать структуру "wrapper" (в C), которая позволяет получить доступ к вашей неисправной структуре, что-то вроде
typedef struct Wrapper_ {
faultyStruct * mystruct ;
faultyStructClass * cls ;
} Wrapper ;
Wrapper wrap(faultyStruct * s) {
Wrapper w = {s, &(s->class) } ;
}
Скомпилируйте этот файл с помощью своего компилятора C и используйте его в своем коде на С++ через extern "C"
Вы также можете использовать препроцессор для переопределения class
(но я не уверен, что это законно для #define ключевых слов на С++