У чому полягає використання універсальних імен символів в ідентифікаторах в C ++


11

Стандарт C ++ (я помітив це в новому, але він вже існував у C ++ 03) вказує універсальні імена символів, написані як \uNNNNта \UNNNNNNNNі представляють символи з кодовими точками unicode NNNN/ NNNNNNNN. Це корисно для рядкових літералів, тим більше, що чітко визначені UTF-8, UTF-16 та UCS-4 рядкові літерали. Однак універсальні літерали символів також дозволені в ідентифікаторах. Яка мотивація за цим?

Синтаксис, очевидно, абсолютно нечитабельний, ідентифікатори можуть бути замінені на лінкер, і це не так, як будь-яка стандартна функція для отримання символів за назвою в будь-якому випадку. То чому б хтось насправді використовував ідентифікатор з універсальними буквами символів у ньому?

Редагувати: оскільки він фактично вже існував у C ++ 03, додатковим питанням буде те, чи бачили ви насправді код, який ним користувався?

Відповіді:


6

ОНОВЛЕННЯ - ця відповідь, хоч і мені, і іншим здавалося, має сенс, виявляється значною мірою помилковою (і достатньо помилковою щодо наміру, як фактично просто неправильної). Оскільки (як було зазначено в коментарі по AProgrammer) це НЕ дозволяється використовувати UCS поза строкових констант , коли той же символ може бути представлений , як правило , в базовий комплект символів. Отже, не використовуючи його для виходу з ключових слів, як у моєму прикладі; і не використовуючи його для створення "ідентифікаторів", схоже 23skiddoна втечу2. Я все-таки міг би використовуватись для того, щоб імена сумісні із зовнішніми мовами, я думаю, але тільки, мабуть, коли ці імена починаються або з літери, або з розширеним символом, і містять лише літери, цифри, підкреслення та розширені символи - які здається занадто обмежуючим, щоб правильно підтримувати цей намір. Отже, повинно бути, що головним наміром є (як у відповіді AProgrammer) дозволити цих додаткових символів в ідентифікаторах та включити редактори джерел, де ці символи відображаються графічно, при цьому все ж дозволяючи вихідному файлу бути в простому ASCII.


Програми C ++ можуть викликати функції, написані іншими мовами. Доброю стратегією з боку комітету зі стандартизації є забезпечення того, що C ++ буде взаємодіяти з іншими мовами, які можуть дозволити не алфавітно-цифрові символи або символи unicode у назвах функцій, навіть якщо таких мов ще не існує. У стандарті не потрібно вказувати, як це працюватиме на рівні лінкера тощо; але добре мати визначений механізм, щоб це дозволяло.

Вам не потрібно дивитись у майбутнє, щоб побачити користь для цього. Припустимо, у мене є стара бібліотека C з функцією в ній, яка називається catch(або захищеною, або змінною) ... і я хочу її зателефонувати з C ++. І з будь-якої причини я не можу або не хочу змінювати код C (до речі, мені вже не раз доводилося стикатися зі старим кодом C, який використовував ім'я функції, що стало ключовим словом C ++ ...)

З іменами UC я можу записати це у заголовок, а потім просто зателефонувати "catch_func ()":

extern "C" {
       int catc\u0068( int a, int b );  // C 'catch()' function
}
inline int catch_func( int a, int b ) { return catc\u0068(a,b); }

Звичайно, це некрасиво, але це не має значення, оскільки він знаходиться лише в одному місці в заголовку. Цей же підхід може бути використаний для створення заглушок для виклику функцій іншими мовами і працює, навіть якщо назви містять ключові слова C ++ або unicode, або пробіли, .або інші розділові знаки, вбудовані в них

На різних інших мовах є пристрої, що дозволяють створювати ідентифікатори, які не відповідають загальній схемі; наприклад, у Verilog, \abcdє ідентифікатором, еквівалентним abcd, але \whileі \23skidooта \44.e2є ідентифікаторами, для чого потрібен префікс зворотної косої риси, щоб його розглядали як такий. Зважаючи на спосіб використання Verilog, важливо взагалі дозволити будь-які імена, де вони стосуються зовнішніх інтерфейсів.


Цікавий випадок використання. Хоча я підозрюю (коли це можливо) було б приємніше написати невеликий файл C для перекладу імені (і, таким чином, можна використовувати ідентифікатор C ++) і мати C ++ виклик цієї функції C.
Томас Едінг

1
Ви не можете написати, що з двох причин перший UCS за межами рядка та літералів символів не може посилатися на символи в основних наборах, не роблячи програму неформованою, по-друге, якщо цього пункту не було, UCS обробляється в фазі 1 перекладу, і таким чином, не було б різниці в обробці між UCS, що звертається до персонажа в базовому наборі, і самого персонажа.
AProgrammer

4

Це дозволяє системі, що дозволяє символам unicode в ідентифікаторі експортувати джерело у формат, який можна компілювати на будь-який стандартний відповідний компілятор. IE - це спосіб кодування унікоду над основним набором символів (більш-менш схожий на друк з цитатами використовується для електронної пошти; системи, які краще знають, здатні зробити кращу роботу, інші системи все ще працюють).


2

Хтось, можливо, захоче створити ідентифікатор, використовуючи символ іноземної мови, який не можна підключити на клавіатурі чи пристрої введення. Крім того, ідентифікатор може містити символ, який не можна роздрукувати за допомогою шрифту або можливостей виводу пристрою, але IDE хоче показати точне подання.


4
У першому випадку ідентифікатор не виглядатиме таким символом, тому код був би нечитабельним, а ідентифікатор не має значення для машини. А по-друге, представництво в IDE - це зовсім окрема проблема.
Ян Худек

1

C ++ вимагає, щоб фактичні розширені символи, що з’являються буквально у джерелі, поводилися однаково з універсальними іменами символів. Дозволення універсальних імен символів у ідентифікаторах дозволяє програмістам використовувати розширені символи в ідентифікаторах.


Підтримуються фактичні розширені символи, вони повинні вести себе як відповідні універсальні символи. Але їх не потрібно підтримувати.
Ян Худек

1
Це правда, але це щось пропускає пункт, який полягає в тому, що якщо комітет хоче вказати, що реалізації, що підтримують розширені символи, повинні підтримувати використання цих символів в ідентифікаторах, тоді для UCN потрібно дозволити в ідентифікаторах. Тобто UCN дозволено в ідентифікаторах, не обов'язково тому, що це так читабельно, і кожен любить кодування імен вручну в шістнадцятковій формі, а тому, що якщо специфікація хоче дозволити використовувати розширені символи в ідентифікаторах, то це зробить, вказавши, що UCN дозволені в ідентифікаторах.
bames53
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.