Использование "умляутов" в коде С++

Возможный дубликат:
Источник С++ в Юникоде

Я только что открыл эту строку кода в проекте:

string überwachung;

Я был удивлен, потому что на самом деле я думал, что вы не разрешаете использовать umlauts, как "äöü" в коде на С++, кроме как в строках и т.д., и это приведет к ошибке компилятора. Но это прекрасно компилируется с визуальной студией 2008 года.

  • Является ли это специальной функцией Microsoft или же умлауты разрешены с другими компиляторами?
  • Есть ли какие-либо потенциальные проблемы с этим (переносимость, системные языковые настройки..)?
  • Я могу четко помнить, что это было запрещено. Когда это изменилось?

С уважением к любому пояснению

P.S.: инструмент cppcheck будет даже отмечать это использование как ошибку, даже если он компилирует

Ответ 1

GCC жалуется на это: codepad

: ошибка: блуждание '\ 303' в программе

Сам язык языка С++ ограничивает базовый набор символов, содержащий 91 печатный символ плюс вкладки, фид формы и новую строку, которые находятся в пределах ASCII. Однако есть хорошая сноска:

Глифы для членов базового набора символов источника предназначены для идентификации символов из подмножества ISO/IEC 10646, который соответствует набору символов ASCII. Однако из-за того, что сопоставление символов исходного файла с исходный набор символов (описанный в фазе 1 перевода) указан в качестве реализации, реализация необходима для как основные исходные символы представлены в исходных файлах.

.. фаза перевода 1 - (внимание мое)

Символы физического исходного файла сопоставляются определенным образом по реализации базовому источнику набор символов (ввод символов новой строки для индикаторов конца строки), если это необходимо. Набор физических принятые исходные файлы символов определены реализацией.

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

Ответ 2

См. раздел E/2 стандарта С++ 03:

1 В этом разделе приведен полный набор шестнадцатеричных кодовых значений, которые действительны для универсальных имен символов в идентификаторах С++ (2.10).

...

Латинский: 00c0-00d6, 00d8-00f6, 00f8-01f5, 01fa-0217, 0250-02a8, 1e00-1e9a, 1ea0-1ef9

Это включает в себя буквы с большей буквы.

Проблема заключается в том, что С++ 03 не указывал UTF-8 в качестве входного формата. Даже С++ 11 поддерживает совместимость с EBCDIC.

Таким образом, вы можете создать идентификатор с помощью umlaut; проблема заключается в получении текстового редактора, который будет интерпретировать имя универсального символа и отображать его правильно. В противном случае вы застряли, вводя Unicode непосредственно в шестнадцатеричном формате \uXXXX, например. \u00FC для ü.

Компилятор, который принимает UTF-8 в строковых константах, но не в идентификаторах, страдает от близорукой реализации. Кланг, по крайней мере, правильно переводит UTF-8 на универсальные имена символов в фазе 1.

Ответ 3

Я считаю, что это предложение, которое применяется...

2.2 Наборы символов

Основной набор символов источника состоит из 96 символов: пробел символ, управляющие символы представляющая горизонтальную вкладку, вертикальную вкладку, фид формы и новую строку, плюс следующие 91 графические символы:

a b c d e f g h i j k l m n o p q r s t u v w x y z
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
0 1 2 3 4 5 6 7 8 9
_ { } [ ] # ( ) < > % : ; . ? * + - / ˆ & | ˜ ! = , \ " ’

Таким образом, использование unlaut будет представлять собой расширение для компилятора.

Ответ 4

Это будет разрешено стандартом тогда и только тогда, когда ваш редактор переводил с символа с умлаутом (или другим диакритическим) на один из разрешенных символов. В частности, идентификатор в С++ определяется как:

identifier:
    nondigit
    identifier nondigit
    identifier digit

nondigit: one of
    universal-character-name
    _ a b c d e f g h i j k l m
      n o p q r s t u v w x y z
      A B C D E F G H I J K L M
      N O P Q R S T U V W X Y Z

Насколько я вижу, это не позволяет символам с диакритикой (кроме как UCN). Мне кажется, что компилятор должен выдавать хотя бы одну диагностику для программы, которая содержит любой символ, отличный от приведенных выше (хотя по-прежнему разрешено переводить программу). Выполняя быструю проверку, я не смог найти флаг компилятора, который получает VС++ для выдачи диагностики для этого кода. По крайней мере, ИМО, в этом отношении он не соответствует.

С другой стороны, это можно было бы просто рассматривать как VС++, реализуя одну из новых функций С++ 11. По крайней мере, начиная с N3242, новый проект С++ добавляет новый элемент после таблицы выше: "другие символы, определенные реализацией". Это дает компилятору разрешение принимать любые другие символы, которые он хочет (хотя он должен документировать то, что они есть).

Ответ 5

Компилятор может поддерживать любые символы в желаемых идентификаторах. Ваш компилятор, по-видимому, поддерживает умлауты. Однако это не гарантируется языковым стандартом. Вы не можете использовать умлауты, если вы ожидаете, что ваша программа будет стандартно.

В другом примере некоторые компиляторы позволяют использовать символ $ в идентификаторах, а спецификация языка не поддерживает его.