Есть ли какое-то значение в разрешении видимости вложенных структур вне структуры в C, но не в C ++? Не нашел ни ссылки, ни актуальности.
struct a
{
struct b{
};
};
int main(){
struct b var; // allowed in C not in C++.
}
Это допустимо в C, потому что C имеет единственное пространство имен, в котором определены все нелокальные типы (то есть типы, не объявленные в функциях); отсутствует определение типов с использованием пространств имен или вложенности.
В C ++ тип b
вложен как член класса a
, поэтому его имя должно быть квалифицировано с областью, в которой оно объявлено.
, поскольку b scope находится внутри a, вы должны использовать вместо этого struct a::b
(и в отличие от C, ключевое слово struct является необязательным).
Я считаю, что возможность ссылаться на вложенные структуры вне структуры была удалена в C ++ для улучшения сокрытия данных. Если вам нужно получить доступ к вложенной структуре извне, то, вероятно, она не должна быть изначально вложенной структурой.
Википедия говорит: «Как в C, так и в C ++ можно определить вложенные типы структур, но область интерпретируется по-разному (в C ++ вложенная структура определяется только в области видимости / пространстве имен внешней структуры)». ( http://en.wikipedia.org/wiki/Compatibility_of_C_and_C%2B%2B ). Это не говорит , почему , но по крайней мере это признает разницу.
Вы можете использовать оператор разрешения пространства имен для доступа к структуре.
Вы не можете объявить что-либо без контекста в C ++. В вашем примере структура b лежит внутри структуры a, компилятор не знает, где найти структуру b
, вы должны использовать
struct a :: b var;
В C нет ограничения для области, но C ++ обеспечивает ограничение