Некоторые вопросы о структуре пространства имен в C - PullRequest
0 голосов
/ 23 ноября 2018

Я пытаюсь понять этот ответ - typedef struct vs struct определения [дубликаты] :

(строка 3): ["] В первомВ строке вы определяете идентификатор S в пространстве имен struct ( не в смысле C ++ ). [. "]

  1. Похоже, что для struct X {...};, {...} похоже на прилагательное для X, а X {...} выбрасывается в нечто, называемое struct-namespace, сколько существует struct-namespace в программе?Есть только один, указанный в struct?
  2. Кажется, что в C / C ++ struct и class почти одинаковы? Так что в C ++ struct и class оба находятся в пространстве имен классов?

Ответы [ 2 ]

0 голосов
/ 23 ноября 2018

Из C99 стандартного чертежа

6.2.3

6.2.3 Пространства имен идентификаторов

Если в какой-либо точке единицы перевода видно более одного объявления определенного идентификатора, синтаксический контекст устраняет неоднозначность использования, которое ссылается на разные объекты.Таким образом, существуют отдельные пространства имен для различных категорий идентификаторов, а именно:

- имена меток (устранены неоднозначно по синтаксису объявления и использования метки);

-теги структур, объединений и перечислений (устраняющие неоднозначность, следуя любому из ключевых слов struct, union или enum);

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

- все другие идентификаторы, называемые обычными идентификаторами (объявленнымив обычных объявлениях или в качестве констант перечисления).

Другими словами, если у вас есть struct S, то S находится в пространстве имен структуры, тогда как если у вас также есть int S, тоон находится в пространстве имен обычных идентификаторов.

Это не относится к C ++

0 голосов
/ 23 ноября 2018

1 (для C): есть одно пространство имен для всех тегов структуры.Вы можете иметь столько различных тегов, сколько хотите, даже если одно и то же имя используется в других пространствах имен.

Каждая структура сама по себе является собственным пространством имен ( существует "бесконечные "структуры имён ).

// You can have
struct foo { int var; }
struct bar { double var; }
struct baz { int var; }
struct qux { int var; }
// with no conflict between all the `var`
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...