Как объявить переменную struct, которая объявлена внутри другой структуры?

#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;
 

}

.