Почему в C есть отдельные пространства имен для тегов и идентификаторов? - PullRequest
0 голосов
/ 25 июня 2018

С cppreference :

1) Пространство имен меток: все идентификаторы объявлены как метки.

2) Имена тегов :все идентификаторы, объявленные как имена структур, объединений и перечислимых типов.

3) Имена членов: все идентификаторы, объявленные как члены какой-либо одной структуры или объединения.Каждая структура и объединение вводит свое собственное пространство имен такого типа.

4) Все остальные идентификаторы , называемые обычными идентификаторами, чтобы отличать их от (1-3) (имена функций, имена объектов, typedef)имена, константы перечисления).

Это позволяет использовать такой код (помимо прочего):

struct Point { int x, y; };
struct Point Point;

Этот код кажется мне несколько неясным, поскольку Point может относиться как ктип и экземпляр структуры.Что послужило причиной наличия отдельных пространств имен для тегов и других идентификаторов?

1 Ответ

0 голосов
/ 25 июня 2018

Фактический вопрос:

Что послужило причиной наличия отдельных пространств имен для тегов и других идентификаторов?

На этот вопрос можно ответить только со ссылкой наОбосновательный документ стандартного комитета, который фактически рассматривает этот вопрос, хотя и кратко:

Реализации до C89 значительно различались по количеству поддерживаемых отдельных пространств имен.Позиция, принятая в Стандарте, состоит в том, чтобы разрешить столько отдельных пространств имен, сколько можно различить по контексту, за исключением того, что все теги (struct, union и enum) составляют одно пространство имен.

( C99 обоснование документ, * раздел 6.2.3)

Таким образом, явно преднамеренно, что код, такой как

struct point { int point; } point = { .point = 0 };
goto point;
point:
return point.point;

, разрешен.Моя интерпретация обоснования заключается в том, что намерение должно было быть неограниченным, хотя остается неясным, почему разным видам тегов не были даны отдельные пространства имен.Это не могло быть случайным, поэтому одна или несколько партий, представленных в комитете, должны были противостоять отдельным пространствам имен тегов, и им удалось победить.Такое возражение вполне могло бы быть связано с бизнесом, а не с техническими причинами.


* Насколько мне известно, для стандарта C2011 нет обосновательного документа.По крайней мере, пока.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...