Apa gunanya nama karakter universal dalam pengidentifikasi di C ++

11

Standar C ++ (saya perhatikan di yang baru, tetapi sudah ada di C ++ 03) menentukan nama karakter universal, ditulis sebagai \uNNNNdan \UNNNNNNNNdan mewakili karakter dengan codepoints unicode NNNN/ NNNNNNNN. Ini berguna untuk string literal, terutama karena string literal UTF-8, UTF-16 dan UCS-4 secara eksplisit juga didefinisikan. Namun, literal karakter universal juga diperbolehkan dalam pengidentifikasi. Apa motivasi di balik itu?

Sintaksnya jelas benar-benar tidak dapat dibaca, pengidentifikasi dapat dikacaukan untuk linker dan itu tidak seperti ada fungsi standar untuk mengambil simbol dengan nama. Jadi mengapa ada orang yang benar-benar menggunakan pengenal dengan literal karakter universal di dalamnya?

Sunting: Karena sebenarnya sudah ada di C ++ 03, pertanyaan tambahan adalah apakah Anda benar-benar melihat kode yang menggunakannya?

Jan Hudec
sumber

Jawaban:

6

PEMBARUAN - jawaban ini, meskipun tampaknya masuk akal bagi saya dan orang lain, ternyata sebagian besar salah (dan cukup salah mengenai maksudnya, sehingga secara efektif hanya salah). Karena (seperti yang ditunjukkan dalam komentar oleh Programmer) itu tidak diizinkan untuk menggunakan UCS di luar konstanta string ketika karakter yang sama dapat direpresentasikan secara normal dalam set karakter dasar. Jadi, jangan menggunakannya untuk menghindari kata kunci, seperti dalam contoh saya; dan tidak menggunakannya untuk membuat 'pengidentifikasi' seperti 23skiddodengan melarikan diri2. Itu masih bisa digunakan untuk membuat nama yang kompatibel dengan bahasa eksternal, saya kira, tetapi hanya, tampaknya, ketika nama-nama itu dimulai dengan huruf atau karakter yang diperluas, dan hanya berisi huruf, digit, garis bawah, dan karakter yang diperluas - yang tampaknya terlalu membatasi untuk mendukung maksud itu dengan benar. Jadi harus maksud utamanya adalah (seperti dalam jawaban Pemrogram) untuk memungkinkan karakter tambahan ini dalam pengidentifikasi, dan untuk mengaktifkan editor sumber di mana karakter ini ditampilkan secara grafis, sementara masih memungkinkan file sumber berada di ASCII polos.


Program C ++ dapat memanggil fungsi yang ditulis dalam bahasa lain. Ini adalah strategi yang baik pada bagian komite standardisasi untuk memastikan bahwa C ++ akan dapat dioperasikan dengan bahasa lain yang memungkinkan karakter non-alfanumerik atau unicode dalam nama fungsi, bahkan jika bahasa tersebut belum ada. Standar tidak perlu menentukan bagaimana ini akan bekerja di tingkat tautan, dll; tapi ada baiknya memiliki mekanisme yang ditentukan untuk memungkinkannya.

Anda tidak perlu melihat masa depan untuk melihat manfaatnya. Misalkan saya memiliki perpustakaan C lama dengan fungsi di dalamnya yang disebut catch(atau dilindungi, atau bisa berubah) ... dan saya ingin memanggilnya dari C ++. Dan untuk alasan apa pun saya tidak bisa atau tidak ingin memodifikasi kode C (Omong-omong, saya sudah lebih dari satu kali harus berurusan dengan kode C lama yang menggunakan nama fungsi yang telah menjadi kata kunci C ++ ...)

Dengan nama UC saya bisa menulis ini di header, dan kemudian panggil saja '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); }

Tentu itu jelek, tapi itu tidak masalah karena hanya di satu tempat di header. Pendekatan yang sama dapat digunakan untuk membuat bertopik untuk memanggil fungsi dalam bahasa lain, dan berfungsi meskipun namanya C ++ kata kunci atau unicode, atau memiliki spasi, .atau tanda baca lain yang tertanam di dalamnya

Berbagai bahasa lain memiliki perangkat yang memungkinkan pembuatan pengidentifikasi yang tidak mengikuti pola umum; misalnya di Verilog, \abcdadalah pengidentifikasi yang setara dengan abcd, tetapi \whiledan \23skidoodan \44.e2juga pengidentifikasi, yang memerlukan awalan backslash untuk dilihat. Karena cara Verilog digunakan, penting untuk mengizinkan nama apa pun, di mana mereka berhubungan dengan antarmuka eksternal.

greggo
sumber
Kasus penggunaan yang menarik. Meskipun saya curiga (bila mungkin) akan lebih baik untuk menulis file C kecil untuk menerjemahkan nama (dan dengan demikian dapat menggunakan pengidentifikasi C ++) dan meminta C ++ memanggil fungsi C.
Thomas Eding
1
Anda tidak dapat menulis bahwa karena dua alasan, UCS pertama di luar string dan karakter literal tidak dapat merujuk ke karakter di set dasar tanpa membuat program menjadi cacat, kedua jika klausa itu tidak ada, UCS ditangani dalam fase 1 terjemahan dan dengan demikian tidak akan ada perbedaan dalam penanganan antara UCS yang merujuk ke karakter dalam set dasar dan karakter itu sendiri.
Pemrogram
4

Hal ini memungkinkan sistem yang memungkinkan karakter unicode dalam pengidentifikasi untuk mengekspor sumber dalam format yang dapat dikompilasi pada setiap kompiler penyesuai standar. Yaitu itu adalah cara untuk menyandikan unicode pada set karakter dasar (kurang lebih seperti dikutip-cetak dapat digunakan untuk email, sistem yang tahu lebih baik mampu melakukan pekerjaan yang lebih baik, sistem lain masih bekerja).

Pemrogram
sumber
2

Seseorang mungkin ingin membuat pengidentifikasi menggunakan karakter bahasa asing yang tidak dapat dimasukkan pada keyboard atau perangkat input. Atau, pengidentifikasi dapat berisi karakter yang tidak dapat dicetak menggunakan font atau kemampuan output perangkat tetapi IDE ingin menunjukkan representasi yang akurat.

akton
sumber
4
Dalam kasus pertama, pengidentifikasi tidak akan terlihat seperti memiliki karakter itu, sehingga kode tidak dapat dibaca dan pengenal tidak terlalu penting bagi mesin. Dan untuk yang kedua, representasi dalam IDE adalah masalah yang sepenuhnya terpisah.
Jan Hudec
1

C ++ mengharuskan karakter diperluas aktual yang muncul secara harfiah dalam sumber berperilaku identik dengan Nama Karakter Universal. Mengizinkan Nama Karakter Universal dalam pengidentifikasi memungkinkan pemrogram untuk menggunakan karakter yang diperluas dalam pengidentifikasi.

bames53
sumber
Jika karakter diperluas sebenarnya didukung, mereka harus berperilaku sebagai karakter universal yang sesuai. Tetapi mereka tidak harus didukung.
Jan Hudec
1
Itu benar tetapi itu agak melenceng, yaitu bahwa jika komite ingin menentukan bahwa implementasi yang mendukung karakter diperluas harus mendukung penggunaan karakter tersebut dalam pengidentifikasi maka yang mengharuskan UCN diizinkan dalam pengidentifikasi. Yaitu UCN diperbolehkan dalam pengidentifikasi, tidak harus karena itu sangat mudah dibaca dan semua orang suka secara manual menyandikan nama dalam heksadesimal, tetapi karena jika spec ingin mengizinkan karakter diperluas untuk digunakan dalam pengidentifikasi maka itu dilakukan dengan menentukan bahwa UCN diizinkan dalam pengidentifikasi.
bames53