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

Есть ли какое-то значение в разрешении видимости вложенных структур вне структуры в C, но не в C ++? Не нашел ни ссылки, ни актуальности.

struct a
{
  struct b{
  };
};

int main(){
  struct b var;  // allowed in C not in C++.
}
24
задан Robᵩ 27 November 2011 в 08:56
поделиться

4 ответа

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

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

34
ответ дан 28 November 2019 в 23:17
поделиться

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

4
ответ дан 28 November 2019 в 23:17
поделиться

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

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

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

8
ответ дан 28 November 2019 в 23:17
поделиться

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

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

struct a :: b var;

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

2
ответ дан 28 November 2019 в 23:17
поделиться