Как пространства имен идентификаторов работают в C? - PullRequest
0 голосов
/ 25 января 2020

Я знаю, как пространства имен работают в C ++, но я немного запутался, как они работают в C. Итак, я провел небольшое исследование о пространствах имен в C.

Во-первых, соответствующий раздел в ISO / IEC 9899: 2018 (C18), раздел 6.2.3:

6.2.3 Пространства имен идентификаторов

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

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

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

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


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

Так что это дает мне немного больше понимание термина в C и, как правило, имеет ту же цель, что и в C ++. Но, к сожалению, в стандарте больше ничего не сказано о том, как пространства имен работают в C.

Очевидно, это как-то связано с различием между сущностями, имеющими один и тот же идентификатор, и, в отличие от C ++, где мы объявляем пространства имен вроде:

namespace ctrl1 
{ 
    int max = 245; 
} 

и используем пространства имен, например :

using namespace ctrl1;

или

int a = ctrl1::max;

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

Как это работает? Как компилятор узнает, будет ли он использовать одну сущность вместо другой в C?


Я прочитал Пространства имен в c ++ и c, но вопрос больше сосредоточены на C ++ и сосредоточены на обработке конкретного c примера.

Я также прочитал Пространства имен в C, где снова цель вопроса более сосредоточена на конкретный пример c, здесь тип enum.


Мой вопрос:

  • Как пространства имен работают в C?

1 Ответ

8 голосов
/ 25 января 2020

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

Как это работает? Как компилятор узнает, должен ли он использовать одну сущность вместо другой в C?

Выдержка из стандарта уже решает эту проблему (выделение добавлено):

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

Метка объявление имеет форму идентификатора, за которым следует двоеточие, за которым должен следовать оператор:

a_label:
do_something;

только использование меток содержится в goto выражениях, а идентификатор в выражении goto может быть только меткой:

goto a_label;

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

"После любого из ключевых слов struct, union, or enum "означает именно то, что написано:

struct a_tag
union another_tag
enum a_third_tag

Эти формы могут появляться в определениях типов, объявлениях типов и типах использования. Если одно из ключевых слов struct, union или enum непосредственно предшествует идентификатору, тогда этот идентификатор является тегом; в противном случае это не так.

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

Появление идентификатора в качестве правого операнда оператора . или -> отличает его как идентификатор структуры или члена объединения. Тип левого операнда определяет структуру или тип объединения. C типы структур и объединений не могут иметь статических членов c, поэтому нет необходимости обращаться к элементу структуры или объединения относительно самого типа, если отсутствует объект этого типа.

- все остальные идентификаторы , называемые обычными идентификаторами

Все, что не охватывается одним из трех других случаев, охватывается этим. Это включает имена переменных, имена функций, имена параметров функций, имена встроенных и typedef ed типов и константы перечисления. (Я думаю, что это полный список, но я мог что-то упустить из виду).

  • Как работают пространства имен в C?

Единственное, что я могу уточнить, это то, что в отличие от C ++, C имеет только неявное объявление и использование пространств имен. В C нет ключевого слова namespace и синтаксиса для явной ссылки на идентификатор относительно выбранного пространства имен. Определяемые пользователем пространства имен, ограниченные теми, которые связаны со структурами и типами объединения, простой, неявный подход удовлетворительно охватывает все возможные случаи.

Учитывая, что категория обычных идентификаторов очень широка, тем не менее, она стала общепринятой для авторы многократно используемых библиотек C для минимизации вероятности конфликтов имен путем добавления префиксов внешних идентификаторов, предоставляемых их библиотеками, с характерными c короткими префиксами. Это ad ho c пространство имен выходит за рамки стандарта, но очень распространено.

...