Некоторые компиляторы поддерживают нестандартное расширение языка C (которое мне действительно нравится, несмотря на то, что оно нестандартное), называемое анонимными структурами (или объединениями). Демонстрация кода:
struct x {
int i;
};
struct y {
struct x;
};
int main(void)
{
struct y;
y.i = 1; // this accesses member i of the struct x nested in struct y
return 0;
}
В двух словах, если вы не дадите члену struct
(или union
) имя, вы можете получить доступ к его членам непосредственно из содержащего struct
(или union
). Это полезно в ситуациях, когда вы могли бы дать ему имя _
, и вам пришлось бы делать y._.i
- синтаксис анонимной структуры намного проще. Однако это означает, что вы должны запомнить имена всех членов обоих struct
s и убедиться, что они никогда не конфликтуют.
Это все, конечно, нестандартное расширение, и его следует использовать с осторожностью. Я считаю, что он работает на MSVC и может быть включен в GCC с помощью коммутатора. Не знаю ни о каких других компиляторах. Если вы беспокоитесь о переносимости, дайте члену правильное имя.
РЕДАКТИРОВАТЬ: В соответствии со ссылкой GCC (ниже), это поведение добавляется в предстоящий стандарт C1X, поэтому он не будет нестандартным в течение длительного времени. Я сомневаюсь, что MSVC будет поддерживать C1X, поскольку они отказываются поддерживать C99 как есть, но по крайней мере эта функция становится частью стандарта.
Однако приведенное выше поведение относится только к MSVC. Синтаксис C1X (и GCC без ключа -fms-extensions
) не позволяет безымянному члену struct
иметь имя:
struct y {
struct {
int i;
};
};
int main(void) {
struct y;
y.i = 1; // this accesses member i of the struct x nested in struct y
return 0;
}
Ссылки на различные компиляторы (они имеют разные имена, но имеют одну и ту же концепцию):
GCC (безымянные поля): http://gcc.gnu.org/onlinedocs/gcc/Unnamed-Fields.html'
MSVC (анонимные структуры): http://msdn.microsoft.com/en-us/library/z2cx9y4f.aspx