Почему стандарт гласит, что в C есть три возможных пространства имен для тегов структур, перечислений и объединений, в то время как они фактически имеют только одно? - PullRequest
0 голосов
/ 08 февраля 2020

В 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, когда они фактически имеют только один (в одной и той же области видимости)?

И почему мы не можем использовать три возможных пространства имен для тегов структур, перечислений и объединений, хотя даже стандарт говорит, что они должны существовать?

1 Ответ

1 голос
/ 08 февраля 2020

Стандарт не говорит, что существуют отдельные пространства имен для структур, объединений и перечислений. В нем говорится, что теоретически возможны три варианта, то есть язык мог бы быть спроектирован так, чтобы иметь отдельные пространства имен для каждого.

Язык мог бы быть спроектирован так, чтобы иметь отдельные пространства имен, поскольку теги появляются только после ключевого слова * 1003. *, union или enum, поэтому компилятор всегда будет знать, какое пространство имен необходимо.

Тем не менее, C разработчики и комитет C решили не использовать это в языке дизайн. Смысл стандарта в том, что существует одно пространство имен, которое содержит все теги структур, объединений и перечислений.

...