Подтвердить что ты не робот

Конфликт именования в С++: как получить доступ к элементу структуры, называемому классом,

Я столкнулся с проблемой именования при работе с библиотекой xlib:

Я использую struct, у которого есть член, называемый "class". Я предполагаю, что эта библиотека в основном используется в простых программах на C. Поэтому проблем нет.

Но я программирую на С++, и здесь имя "класс" является ключевым словом и не может использоваться для обозначения переменных. Итак, если я получаю доступ к структуре через

myvariable = mystruct->class;

Я получаю сообщение об ошибке:

expected unqualified-id before ‘class’

Учитывая, что я не могу самостоятельно изменить структуру, как я могу получить доступ к этому члену структуры, несмотря на конфликт имен?

4b9b3361

Ответ 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 ключевых слов на С++