Типичный способ C99 для расширения структуры выглядит примерно так:
struct Base {
int x;
/* ... */
};
struct Derived {
struct Base base_part;
int y;
/* ... */
};
Затем мы можем преобразовать экземпляр struct Derived *
в struct Base *
, а затем получить доступ к x
.
Я хочу получить доступ к базовым элементам struct Derived * obj;
напрямую, например, obj->x и obj->y. C11 предоставляет расширенные структуры, но, как объяснено здесь, мы можем использовать эту функцию только с анонимными определениями. . Тогда как насчет написать
#define BASE_BODY { \
int x; \
}
struct Base BASE_BODY;
struct Derived {
struct BASE_BODY;
int y;
};
Затем я могу получить доступ к базовым членам так же, как к производным, без каких-либо приведения или промежуточных членов. Я могу привести производный указатель к базовому указателю, если это необходимо.
Это приемлемо? Есть ли подводные камни?
typedef
(см. этот ответ) через параметр-fms-extensions
вgcc
илиclang
, но это нестандартно. - person Grzegorz Szpetkowski   schedule 10.11.2014