#c
#c
Вопрос:
У меня есть структура, которая объявлена следующим образом:
struct a {
struct b {
int d;
} c;
};
Как объявить переменную b
outside a
? В C я могу использовать a::b x;
. Но в C требуется указать struct
ключевое слово перед именем структуры.
Ответ №1:
C имеет плоскую компоновку; когда вы объявляете структуру внутри другой структуры, первая просто помещается в глобальное пространство имен.
Итак, в вашем примере это просто struct b
.
Комментарии:
1. Где это сказано в стандарте?
2. @david.pfx не уверен, но 6.2.1
If the declarator or type specifier that declares the identifier appears outside of any block or list of parameters, the identifier has file scope
3. @keltar: На самом деле, нет. Я думаю, что это может быть 6.2.3 Пространства имен и примечание 32, которые дают понять, что существует только одно пространство имен для тегов, но отдельное пространство имен для членов каждой структуры или объединения.
Ответ №2:
C не имеет вложенных типов. Вы не можете написать a::x b
или что-то, что ее повторяет. Если вы хотите избавиться от struct
ключевого слова, это еще одна проблема. Используйте typedef
s. но это не позволит вложить типы.
typedef struct b_t {
int d;
} b;
typedef struct {
b c;
} a;
b some_b;
a some_a;
int f() {
some_b.d=42;
some_a.c=some_b;
return 0;
}
.