Вложенные структуры в C и С++

Существует ли какое-либо значение, позволяющее видеть вложенные структуры вне структуры в C, но не на С++? Я не нашел ссылки или релевантности.

struct a
{
  struct b{
  };
};

int main(){
  struct b var;  // allowed in C not in C++.
}

Ответ 1

Он действителен в C, потому что C имеет одно пространство имен, в котором определены все нелокальные типы (т.е. типы, не объявленные в функциях); нет областей охвата типов с использованием пространств имен или вложенности.

В С++ тип b вложен как член класса a, поэтому его имя должно быть квалифицировано с областью, в которой она объявлена.

Ответ 2

Я считаю, что способность ссылаться на вложенные структуры вне структуры была удалена на С++, чтобы улучшить скрытие данных. Если вам нужно получить доступ к вложенной структуре извне, то она, вероятно, не должна быть вложенной структурой в первую очередь.

Википедия говорит: "В C и С++ можно определить вложенные типы структур, но область интерпретируется по-разному (в С++ вложенная структура определяется только в пространстве/пространстве имен внешней структуры)". (http://en.wikipedia.org/wiki/Compatibility_of_C_and_C%2B%2B). Он не говорит, почему, но по крайней мере он признает разницу.

Однако вы можете использовать оператор разрешения пространства имен для доступа к структуре.

Ответ 3

поскольку область b находится внутри a, вы должны вместо этого использовать struct a::b (и в отличие от C, ключевое слово struct необязательно).

Ответ 4

Вы не можете объявить что-либо без рамки в С++ В вашем примере struct b лежит внутри struct a, компилятор не знает, где найти struct b

вы должны использовать

struct a :: b var;

В C нет ограничений для области видимости, но С++ обеспечивает ограничение