В ISO / IEC 9899: 2018 (C18), 6.2.3 "Пространства имен идентификаторов" указано (выделите мое):
6.2.3 Пространства имен идентификаторы
1 Если в какой-либо точке единицы перевода видно более одного объявления определенного идентификатора, контекст syntacti c устраняет неоднозначность использования, которое ссылается на разные объекты. Таким образом, существуют отдельные пространства имен для различных категорий идентификаторов, а именно:
имен меток (устраненных неоднозначностью из-за синтаксиса объявления и использования меток);
теги структур, объединений и перечислений (устраняющих неоднозначность, следуя any32) ключевых слов struct, union или enum);
членов структур или объединений; каждая структура или объединение имеет отдельное пространство имен для своих членов (неоднозначное по типу выражения, используемого для доступа к члену через оператор. или ->);
все другие идентификаторы, называемые обычными идентификаторами (объявленными в обычных объявлениях или в качестве констант перечисления).
32) Для тегов существует только одно пространство имен три возможны .
Что они означают с ", хотя три возможны. " Что это такое "возможно" в точности?
В качестве эксперимента я попытался скомпилировать следующий код:
#include <stdio.h>
int main()
{
struct foo{
int a;
double b;
float c;
};
enum foo{
Test1,Test2,Test3
};
union foo{
int x;
double y;
float z;
};
return 0;
}
Я получил ошибку:
Ошибка: 'foo' определен как неверный тип тега
для определения enum
и union
, как вы можете видеть здесь , что доказывает, что для всех struct
предусмотрено только одно пространство имен, Теги enum
и union
определены в той же области видимости, что и описанный стандарт. Но как насчет этих двух других «возможных» пространств имен?
Мой вопрос таков:
- Почему в стандартном заявлении есть три возможных пространства имен для тегов структур, перечислений и объединения в C, когда они фактически имеют только один (в одной и той же области видимости)?
И почему мы не можем использовать три возможных пространства имен для тегов структур, перечислений и объединений, хотя даже стандарт говорит, что они должны существовать?