Во-первых, обратите внимание, что ваш пример не является стандартным C89 (но он приемлем для некоторых компиляторов, когда вы запрашиваете некоторые языковые расширения. С GCC вам потребуется расширить принятый диалект C с флагом -fms-extensions
для компилятора).Вы используете безымянные поля .Более стандартным способом кодирования будет:
struct a {
int foo;
};
struct b {
char* bar;
};
struct {
struct a aa;
struct b bb;
} s;
Вернемся к вашему вопросу, нет, другого пути нет.Однако вы можете использовать макросы препроцессора, которые могут помочь.Например, предполагая вышеупомянутые объявления, вы можете
#define afoo aa.foo
#define bbar bb.bar
, а затем вы можете кодировать s.afoo
вместо s.aa.foo
Вы также можете определить макросы как
#define AFOO(X) (X).aa.foo
, а затем код AFOO(s)
Использование таких макросов препроцессора вызывает некоторое раздражение: в моем примере вы больше не можете объявлять переменную (или формальный аргумент, или поле, или функцию) с именем afoo
Но я не уверен, что вам стоит беспокоиться.Мой личный совет и привычка - давать более длинные и часто уникальные имена полям (а также называть struct a_st
my struct
-ures).Воспользуйтесь возможностями автозаполнения вашего редактора.Не забывайте, что ваш код читается чаще, чем пишется, поэтому используйте в нем значимые имена.