Если вы используете clang или gcc, вы можете использовать typeof
:
struct foo {
struct {
int i;
} anon;
} foo;
void do_something(typeof(foo.anon)* member) {
member->i = 1;
}
Если нет глобального экземпляра вашего типа, вы можете использовать typeof((struct foo){}.anon)
.
Это имеет много минусов. Наиболее очевидные из них:
- это не стандартно и связывает вас с clang / gcc
- это чертовски ужасно
- в любом случае он может вести себя не так, как вы ожидаете
Например, структурно-эквивалентные анонимные типы не имеют одинаковый тип, поэтому примерно так:
struct foo {
struct {
int i;
} anon1;
struct {
int i;
} anon2;
} foo;
anon1
и anon2
имеют разные типы, это означает, что typeof
один из них не может использоваться для обозначения обоих.
В долгосрочной перспективе вы почти наверняка обнаружите, что стоит называть структуры, особенно если вы используете их в качестве аргументов функций. Например, если вы хотите сделать вашу переменную доступной из заголовка, я думаю, вам придется приложить немало усилий, чтобы сохранить ее анонимной.
Хотя это не особенно красиво и не совместимо с C ++, C помещает имя вложенных объявлений в глобальное пространство имен, так что это переносимо, и это не очень большое изменение кода для фронтальной загрузки:
struct {
struct not_anon {
int i;
} anon;
} foo;
void do_something(struct not_anon* member) {
member->i = 1;
}