Пространства имен в формальном определении C - PullRequest
0 голосов
/ 23 ноября 2018

Я читаю стандарт N1570 и у меня возникла проблема с пониманием формулировки определения пространства имен .Вот оно:

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

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

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

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

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

32) Существует только одно пространство имен для тегов, хотя возможны три.

Здесь речь идет о том, что если более 1 объявление определенных идентификаторов является видимым.Теперь слова что-то вроде «Для доступа к идентификатору необходимо указать его пространство имен» или «Для доступа к идентификатору в определенном пространстве имен ...».

1 Ответ

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

Позвольте мне сначала показать пример (это строго для понимания цели, не пишите такой код, ever )

#include  <stdio.h>


int main(void)
{
    int here = 0;    //.......................ordinary identifier
    struct here {    //.......................structure tag
        int here;    //.......................member of a structure
    } there;

here:                             //......... a label name
     here++;
     printf("Inside here\n");
     there.here = here;           //...........no conflict, both are in separate namespace
     if (here > 2) {
         return 0; 
     }
     else
       goto here;                 //......... a label name

    printf("Hello, world!\n");          // control does not reach here..intentionally :)
    return 0;
}

Вы видите использованиеидентификатор here.Они принадлежат отдельным пространствам имен в соответствии с правилом, поэтому с этой программой все в порядке.

Однако, скажем, например, вы изменили имя структурной переменной с there на here, и выВы увидите конфликт, поскольку тогда в одном и том же пространстве имен будут два отдельных объявления одного и того же идентификатора (обычного идентификатора).

...