Фактический вопрос:
Что послужило причиной наличия отдельных пространств имен для тегов и других идентификаторов?
На этот вопрос можно ответить только со ссылкой наОбосновательный документ стандартного комитета, который фактически рассматривает этот вопрос, хотя и кратко:
Реализации до C89 значительно различались по количеству поддерживаемых отдельных пространств имен.Позиция, принятая в Стандарте, состоит в том, чтобы разрешить столько отдельных пространств имен, сколько можно различить по контексту, за исключением того, что все теги (struct, union и enum) составляют одно пространство имен.
( C99 обоснование документ, * раздел 6.2.3)
Таким образом, явно преднамеренно, что код, такой как
struct point { int point; } point = { .point = 0 };
goto point;
point:
return point.point;
, разрешен.Моя интерпретация обоснования заключается в том, что намерение должно было быть неограниченным, хотя остается неясным, почему разным видам тегов не были даны отдельные пространства имен.Это не могло быть случайным, поэтому одна или несколько партий, представленных в комитете, должны были противостоять отдельным пространствам имен тегов, и им удалось победить.Такое возражение вполне могло бы быть связано с бизнесом, а не с техническими причинами.
* Насколько мне известно, для стандарта C2011 нет обосновательного документа.По крайней мере, пока.