в 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 пространство имен выходит за рамки стандарта, но очень распространено.