можно как-нибудь вот так сделать: Код (Text): struct Base { int a; int b; }; struct Box { Base; int c; int d; }; struct ExtendedBox { Box; int x; int y; } main () { ExtendedBox box = {0}; box.a = 20; } чтобы без шаблонов и макросов.
Они не разрешены нигде. А какой в них смысл? Вообще и в конкретно этом примере. Зачем в структуре держать данные, к которым невозможно будет обратиться?
В С99 судя по стандарту и comeau нельзя. Но VC компилирует такое Код (Text): typedef struct tagA { int i; } A; typedef struct tagB { A; int i2; } B; int main() { B b; b.i = 0; b.i2 = 0; } сталкивался где то в .h микрософфта )
cppasm ну можно же вот так например: Код (Text): struct ExtendedBox { int x; union { struct { char a0; char a1; char a2; char a3; }; int a; }; int y; } main () { ExtendedBox box = {0}; box.a = 20; return a0 == a3; } чтобы не делать так: x.uni.struc.a0 == x.uni.struc.a3 конкретно в этом примере можно было бы: 1) Создавать структуры из структур (для моей задачи очень уж это подходит), не усложняя способ обращения к полям. 2) Легким движением руки сдампить такие структуры в файл, чего нельзя добиться используя наследование.
Из того что ты непонял чего я хочу, не следует что тема ни о чем ) Мне надо нагенерить файлы, в которых лежали бы разные виды структур, которые состоят из других структур + свои данные. Как бы ты решил такую задачу, допустим с вложенностью 10? вот так? ExtendedBox box; Код (Text): box.box.base.a = 20; box.box.base.b = 35; box.box.c = 42; box.box.d = 22; box.x = 11; box.y = 88; fwrite (box, sizeof (box), 1, file); А если вложенность 10, и полей чуть побольше? Ну или покажи как это реализовать через наследование что бы было так же просто ).
вот теперь я в вашем посте просматриваю некоторый вопрос мой ответ вложеность перекрыветься в больших проектах #define'ами а вообще я бы вернулся к сути самой задачи возможно там все можно переделать по другому избегая вложеностей вообще
define'ы это дело хорошее конечно, но задача стояла чтобы без шаблонов, макросов и наследования. Как это сделать define'ами я и сам знаю ). А вопрос стоял в моем первом посте вполне конкретный: возможно ли объявить в си безымянный член структуру примерно таким способом как я показал или нет. Поэтому "вернулся к сути задачи" - это offtop. )
тоесть другими словами вы спрашиваете "можно ли на языке С писать языком бейсика или паскаля" ответ да - возможно это называеться извращение поэтому вся тема не о чем больше в хип чем в язык С
letopisec твой пример не собирается, потому что первым полем должно быть. но если генерируешь файл сам, то почему не "копи-пастить" поля структур генератором?
Я мож чего не понимаю, но как безымянная структура тебе поможет? Безымянная структура безсмысленна - к её полям нельзя обратиться. Безымянный union смысл имеет - он указывает что переменные разделяют одну и ту же область памяти. Какой смысл в безымянной структуре я до сих пор не понял. Единственное применение - это резервирование места, но тебе надо другое. У тебя вопрос по сути такой: как обратиться к полю структуры, не указывая к какому именно. Ответ - никак. Это специфические случаи, к теме по-моему отношения не имеющие.
Раньше то в С можно было давным давно, сейчас define можно типа (фигня конечно) class X { struct a { int a; } t_; int &a; X():a(t_) {} };