Что представляет собой "действительный" идентификатор "с"?

в @Заибись предложение (и связанные с моей собственной ответ to каковы допустимые символы для имен макросов?, а также

4 ответов


как упоминали другие, приложение D ISO / IEC 9899: 2011 перечисляет шестнадцатеричные значения символов, допустимые для универсальных имен символов в C11. (Я не буду повторять это здесь.) Я искал ответ на вопрос "почему" был выбран этот список.

стандарты набора символов

во-первых, есть два соответствующих стандартов, определяющих набор символов: ISO / IEC 10646 (определение UCS) и Unicode. Чтобы еще больше запутать (или упростить) вещи, они определяют те же символы поскольку ISO и Unicode сохраняют их синхронизироваться. UCS-это, по сути, просто карта символов, связывающая значения с набором символов ("репертуар"), в то время как Unicode также дает дополнительные определения, такие как сравнение строк в алфавитном порядке сортировки (сортировка), которые кодовые точки представляют собой "канонически эквивалентные" символы (нормализация), и двунаправленный алгоритм для того, как обрабатывать символы на языках, написанных справа налево, и многое другое.

универсальные имена символов в C

универсальные имена символов (UCN) - это функция, недавно добавленная в C99 (ISO/IEC 9899:1999). В разделе "обоснование международного стандарта - - - языки программирования - - - C" (Откр. 2, Окт. 1999), целью было "включить использование любого "родного" символа в идентификаторах, строковых литералах и символах константы, сохраняя при этом цель переносимости C" (sec. 5.2.1). Этот раздел продолжает о проблемах, как кодировать эти символы в C (\U и \u формы по сравнению с многобайтовыми символами или собственными кодировками) и политические модели того, как с этим бороться (стр. 14, см PDF страница 22).

обоснование

Я надеялся, что то же самое документ "обоснование" от 1999 даст причину, почему каждый расширенный диапазон символов был выбран как приемлемый для UCNs C99. Приложение I к обоснованию в целом гласит:

Приложение I универсальные имена символов для идентификаторов (нормативные)

новая функция C9X.

это не обоснование. Они даже не знали, в каком году будет опубликован стандарт C, поэтому он просто называется "C9X". Более позднее обоснование документа от 2003 немного больше просвещение:

приложение D универсальные имена символов для идентификаторов (нормативные)

новая функция для C99.

намерение состоит в том, чтобы поддерживать ток с ISO/IEC TR 10176.

ISO / IEC TR 10176 is " руководство по подготовке стандартов языка программирования."Это в основном путеводитель для людей, которые пишут стандарты языка программирования. Она включает руководящие принципы для использования наборов символов на языках программирования, а также" рекомендуемого расширенного справочника по определяемым пользователем идентификаторам " (приложение а). Но эта цитата из документа 2003 rationale является только "намерением сохранить актуальность", а не обещанием строгого соблюдения TR 10176.

есть общедоступный ISO/IEC TR 10176:2003 таблица символов. Значения символов см. В ISO 10646. Таблица классифицирует диапазоны символов из различных языков как будучи "прописными буквами"Lu; "нижний регистр"Ll; "число, цифра" Nd, "пунктуация, разъем" Pc; etc. Должно быть ясно, какое использование имеют такие классификации для языка программирования.

важным напоминанием является то, что TR 10176 является техническим отчетом, а не стандартом. Я нашел несколько ссылок на него на форумах и в документах, связанных с другими языками программирования, такими как Ada, COBOL и D language. Большая часть дискуссии была о том, как стандарты этих языков должны строго соответствовать стандарту TR 10176 (не являющемуся стандартом) и жалобам на то, что TR 10176 отстает от обновлений ISO 10646.

пожалуй, наиболее информативный документ WG21 / N3146: "рекомендации для расширенных символов идентификаторов для C и c++."Он начинается с комментария в 2010 году к органу стандартов, рекомендующему ограничения на начальные символы идентификаторов. Он упоминает похожие жалобы на C referencing TR 10176, и делает предложения о том, какие символы должны быть разрешены в качестве начальных символов идентификатора на основе ограничений из идентификатор Unicode и синтаксис шаблона и общие синтаксические конструкции XML. WG21 / N3146 дает предлагаемую формулировку, которая позже появилась в стандарте C11 ISO / IEC 9899: 2011. В конце документа есть таблица, которая помогает пролить свет на выбранные диапазоны символов.

символов и не разрешено в C11

Ниже приведен скомпилированный список диапазонов для продлен символы. The жирным шрифтом диапазоны приведены в C11 (ISO / IEC 9899: 2011 приложение D). Некоторые комментарии добавлены о курсивом диапазоны не указан в C11 (т. е. не допускается). Они либо отмечены в WG21 / N3146 как запрещен юникодов UAX#31 или общий синтаксический XML Конструкции, или запрещено каким-либо другим комментарием.

00A8, 00AA, 00AD, 00AF, 00B2-00B5, 00C0-00D6, 00D8-00F6, 00F8-00FF: (различные символы, такие как женские и мужские порядковые знаки º, гласные с диакритикой, числовые символы, такие как числа надстрочного кода, дроби и т. д.)

(предыдущие пробелы): все запрещен UAX31 и/или XML. (Обычно знаки типа пунктуации, такие как "", денежные символы ¥£, математические операторы × ÷ и др.)

0100-167F: (латинский, греческий, кириллица, арабский, тайский, эфиопский и др.---многие другие)

1680: "блок Ogham содержит пространство, специфичное для скрипта:"

1681-180D: (огам, Тагальский, монгольский и др.)

180E: "монгольский блок содержит специфичное для скрипта пространство"

180F В-ЭТОГО ЗНАЧЕНИЯ 1FFF: (далее языки... фонетика, расширенная латынь и греческий и т. д.)

2000: запускает блок" общая пунктуация", но некоторые разрешены:

200B-200D, 202A-202E, 203F-2040, 2054, 2060-206F: (выделение из блока "общая пунктуация")

2070-218F: "надписи и индексы, символы валюты, сочетание диакритических знаков для символов, Буквоподобные символы, число Формы"

2190-245F: "Стрелки, Математические Операторы, Различные Технические, Контрольные Изображения, Оптическое Распознавание Символов"

2460-24FF: "Прилагаемые Буквенно-Цифровые Обозначения"

2500: запускает "чертеж коробки, элементы блока, геометрические фигуры"и т. д.

2776-2793: (некоторые dingbats и кружил, дубины)

2794-2BFF: (другой набор булкой , математические символы, стрелки, узоры Брайля и т. д.)

2C00-2DFF, 2E80-2FFF: "Глаголитическое, латинское Extended-C, коптское, грузинское дополнение, тифинаг, эфиопское Extended, кириллическое Extended-A" (также CJK радикальное дополнение)

3000: (начало "символов и знаков препинания CJK", некоторые выборы разрешены)

3004-3007, 3021-302F, 3031-303F: (разрешены символы CJK и Пунктуация")

3040-D7FF:" Хирагана, катакана", другие идеограммы CJK, радикалы и т. д.

D800-F8FF: (это начинается высокий и низкие суррогатные области (числовое пространство, необходимое для кодировок), и Частного Использования)

оптом-F900-FD3D, FD40-FDCF, FDF0-FE44, FE47-FFFD: выбор из "идеограмм совместимости CJK", "арабских форм представления" и т. д. 10000-1FFFD, 20000-2FFFD, 30000-3FFFD, 40000-4FFFD, 50000-5FFFD, 60000-6FFFD, 70000-7FFFD, 80000-8FFFD, 90000-9FFFD, A0000-AFFFD, B0000-BFFFD, C0000-CFFFD, D0000-DFFFD, E0000-EFFFD: WG21 / N3146 дает обоснование для этих конечных диапазонов:

дополнительная частная область использования простирается от F0000 до 10FFFF; оба [AltId] и [XML2008] запретить символы в этом диапазоне.

кроме того, [AltId] запрещает, как не символы, последние две кодовые позиции каждой плоскости, т. е. каждую позицию формы PFFFE или PFFFF, для любого значения P.

"диапазоны символов, запрещенных изначально" из C11 приложение D. 2 являются 0300-036F, 1DC0-1DFF, 20D0-20FF, FE20-FE2F.

С WG21 / N3146 помещается рядом с приложением D стандарт C11, много может делайте выводы о том, как они выстраиваются. Например, математические операторы и знаки пунктуации не допускаются. Надеюсь, это прольет свет на" почему "или" как " были выбраны разрешенные персонажи.


TLDR; версия

  • авторитетным источником для символов юридического идентификатора является стандарт C11 ISO / IEC 9899: 2011 (См. Приложение D).
  • этот список основан на техническом отчете, ISO / IEC TR 10176, но с модификации.

C стандарт 2011

6.4.2 идентификаторы

общие 6.4.2.1
...
3 каждое универсальное имя символа в идентификаторе должно обозначать символ, кодировка которого в ISO / IEC 10646 попадает в один из диапазонов, указанных в D. 1.71) начальный символ не должно быть универсальным именем символа, обозначающим символ, кодировка которого один из диапазонов, указанных в D. 2. Реализация может разрешить многобайтовые символы которые не являются частью базового исходного набора символов для отображения в идентификаторах; какие символы и их соответствие универсальным именам символов определяется реализацией.
...
71) в системах, в которых компоновщики не могут принимать расширенные символы, кодировка универсального символа имя может использоваться при формировании допустимых внешних идентификаторов. Например, некоторые неиспользуемые символ или последовательность символов могут использоваться для кодирования \u в универсальное имя персонажа. Расширенные символы могут создавать длинный внешний идентификатор.
...

Приложение D

(нормативных)

универсальные имена символов для идентификаторов

1 в этом предложении перечислены шестнадцатеричные значения кода, допустимые в универсальных именах символов в идентификаторах.

D. 1 разрешенные диапазоны символов

1 00A8, 00AA, 00AD, 00AF, 00B2-00B5, 00B7 - 00BA, 00BC-00BE, 00C0-00D6, 00D8-00F6, 00F8-00FF

2 0100-167F, 1681-180D, 180F-1FFF

3 200B-200D, 202A-202E, 203F-2040, 2054, 2060-206F

4 2070-218F, 2460-24FF, 2776-2793, 2C00-2DFF, 2E80-2FFF

5 3004-3007, 3021-302F, 3031-303F

6 3040-D7FF

7 F900-FD3D, FD40-FDCF, FDF0-FE44, FE47-fffd

8 10000-1FFFD, 20000-2FFFD, 30000-3FFFD, 40000-4FFFD, 50000-5FFFD, 60000-6FFFD, 70000-7FFFD, 80000-8FFFD, 90000-9FFFD, A0000-AFFFD, B0000-BFFFD, C0000-CFFFD, D0000-DFFFD, E0000-EFFFD

D. 2 диапазоны символов изначально запрещены

1 0300-036F, 1DC0 - 1DFF, 20D0 - 20FF, FE20-FE2F

синтаксис идентификаторов, которые включают имена макросов, представлен в разделе 6.4.2 стандарта C2011, как интерпретируется в свете приложения D. 1. Эти положения предусматривают, что каждый идентификатор может содержать символы подчеркивания, латинские буквы верхнего и нижнего регистра, десятичные цифры, последовательности символов, составляющие "универсальные имена символов" (с учетом ограничений),и любой другой символ, определенный реализацией.

универсальные имена символов (UCNs) являются Escape-последовательности Unicode, аналогичные тем, которые предоставляются Java, Python и некоторыми другими языками: они начинаются с обратной косой черты (\), за которым следует u или U, и четыре или восемь шестнадцатеричных цифр соответственно. Существуют некоторые ограничения на конкретные последовательности шестнадцатеричных цифр, которые могут использоваться, некоторые общие, другие специфические для контекста идентификатора. Заметьте, однако, что синтаксически, единственный дополнительный символ, который положение для UCNs позволяет появиться в идентификаторах-это обратная косая черта; все остальные символы, которые могут появиться в UCN, разрешены в идентификаторах вне контекста UCN.

таким образом, говоря синтаксически и ограничивая обсуждение символами, которые стандарт требует, чтобы быть разрешенными в идентификаторах, подчеркивание, (без акцента) латинские буквы, десятичные цифры и обратная косая черта являются единственными символами, которые C требует, должны поддерживаться в идентификаторах. Поддержка обратной косой черты требуется только в контекст UCNs, и не все допустимые UCNs разрешены в идентификаторах. Кроме того, стандарт не требует поддержки цифр в качестве первых символов идентификаторов.

С другой стороны, стандарт вполне либерально, позволяя "другу осуществления определенных символов" в идентификаторах, в том числе в качестве первого символа. Даже десятичные цифры, которые в противном случае не могут быть первым символом в идентификаторе, в принципе могут быть разрешены в этой позиции положение, по усмотрению осуществления. Если вы хотите, чтобы ваш код был переносимым среди реализаций, вы не будете полагаться на это положение в любом месте. Если вы хотите знать, какие символы позволяет ваша конкретная реализация, вы должны обратиться к его документации.

каждая соответствующая стандарту реализация должна документировать свое поведение в отношении каждой детали, которую стандарт объявляет определенной реализацией. Например, GCC документация указывает, что знак доллара ($) допускается в идентификаторах на большинстве архитектур. Вы сами связали и процитировали документацию Clang той же детализации, определенной реализацией, которая более либеральна-она позволяет всем символам, которые могут быть представлены в идентификаторах через UCNs, также быть представлены последовательностями байтов UTF-8. Во многих случаях при отображении или печати исходного кода, содержащего такие последовательности байтов, они будут отображаться как один дисплей характер.


как уже было сказано,Стандарт C11 определяет несколько допустимых диапазонов символов Юникода.

  • 00A8, 00AA, 00AD, 00AF, 00B2-00B5, 00B7-00BA, 00BC-00BE, 00C0-00D6, 00D8-00F6, 00F8-00FF
  • 0100-167F, 1681-180D, 180F-1FFF
  • 200B-200D, 202A-202E, 203F-2040, 2054, 2060-206F
  • 2070-218F, 2460-24FF, 2776-2793, 2C00-2DFF, 2E80-2FFF
  • 3004-3007, 3021-302F, 3031-303F
  • 3040-D7FF
  • оптом-F900-FD3D, FD40-FDCF, FDF0-FE44, FE47-FFFD
  • 10000-1FFFD, 20000-2FFFD, 30000-3FFFD, 40000-4FFFD, 50000-5FFFD, 60000-6FFFD, 70000-7FFFD, 80000-8FFFD, 90000-9FFFD, A0000-AFFFD, B0000-BFFFD, C0000-CFFFD, D0000-DFFFD, E0000-EFFFD

это также означает, что существует несколько диапазонов символов, исключенных из использования.
Из ваших примеров:

  • is is 260E и от Блок" разные символы":2600-26FF что означает, что вы упускаете все эти
  • и 274C и из блока" Dingbats": 2700-27BF что это все эти но некоторые из них допускается (2776−2793)
  • is is 21E7 и из блока "стрелки":2190-21FF что означает, что вы упускаете все эти
  • is is 3013 и из блока" символы и знаки препинания CJK": 3000-303F что все эти но некоторые из них разрешены.
  • и 1F34E и из блока" разные символы и пиктограммы": 1F300-1F5FF что это все эти и на самом деле должны работать
    (возможно, a ? кстати, это не отображается на моем домашнем компьютере (Ubuntu), но на моем рабочем ПК (Win7))