C ++の識別子での汎用文字名の使用とは


11

C ++標準では(私は新しいもので、それに気づいたが、それはすでにC ++ 03には存在しなかった)のように書かユニバーサル文字名を指定\uNNNNし、\UNNNNNNNNおよびUnicodeのコードポイントで文字を表しますNNNN/ NNNNNNNN。これは、特に明示的にUTF-8、UTF-16、およびUCS-4文字列リテラルも定義されているため、文字列リテラルで役立ちます。ただし、識別子には汎用文字リテラルも使用できます。その背後にある動機は何ですか?

構文は明らかに完全に判読不能で、識別子はリンカ用にマングルされている可能性があり、とにかくシンボルを名前で取得する標準関数があったようではありません。それでは、なぜ誰もが実際にユニバーサル文字リテラルを含む識別子を使用するのでしょうか?

編集:実際にはすでにC ++ 03に存在していたので、追加の質問は、それを使用したコードを実際に見たかどうかです。

回答:


6

更新 -この答えは、私や他の人には理にかなっているように見えますが、大部分が間違っていることがわかります(事実上、単に意図的に間違っているように意図に関して十分に間違っています)。(AProgrammerのコメントで指摘されているように)基本文字セットで同じ文字を通常表現できる場合、文字列定数の外側でUCSを使用すること許可されていません。したがって、私の例のように、キーワードをエスケープするために使用しないでください。そして、それを使用して「識別子」を作るのではなく23skiddo2。外部言語と互換性のある名前を作成するためにまだ使用できますが、それらの名前が文字または拡張文字で始まり、文字、数字、下線、および拡張文字のみが含まれている場合にのみ、その意図を適切にサポートするには制限が多すぎるようです。したがって、主な目的は、識別子にこれらの余分な文字を許可し、ソースファイルがプレーンASCIIであることを許可しながら、これらの文字がグラフィカルに表示されるソースエディタを有効にすることです(AProgrammerの答えのように)。


C ++プログラムは、他の言語で記述された関数を呼び出す場合があります。標準化委員会の側では、C ++が他の言語と相互運用可能であり、そのような言語がまだ存在していなくても、関数名に英数字やユニコード文字を使用できるようにすることをお勧めします。標準では、リンカーレベルなどでこれがどのように機能するかを指定する必要はありません。しかし、それを可能にするために特定のメカニズムを用意しておくのは良いことです。

これを使用するために将来を調べる必要はありません。関数が呼び出されたcatch(または保護された、または可変の)古いCライブラリがあり、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); }

確かにitいですが、ヘッダーの1か所にしか存在しないので問題ではありません。同じアプローチを使用して、他の言語の関数を呼び出すスタブを作成することができます。また、名前がC ++キーワードまたはUnicodeであるか、スペース.や他の句読点が埋め込まれている場合でも機能します。

他のさまざまな言語には、一般的なパターンに従わない識別子を作成できるデバイスがあります。たとえば、Verilogでは、\abcdはに相当する識別子ですabcd\while\23skidoo\44.e2は識別子でもあります。Verilogの使用方法により、外部インターフェイスに関連するすべての名前を許可することが重要です。


興味深いユースケース。(可能であれば)名前を翻訳する(したがってC ++識別子を使用できる)小さなCファイルを作成し、C ++にそのC関数を呼び出させる方が良いと思われますが。
トーマスエディング14

1
あなたは2つの理由でそれを書くことはできません。最初に文字列と文字リテラルの外側のUCSはプログラムを不正にすることなく基本セットの文字を参照できません、2番目の句が存在しなかった場合UCSは翻訳のフェーズ1で処理されしたがって、基本セット内の文字を参照するUCSと文字自体の処理に違いはありません。
AProgrammer 14

4

これにより、システムは識別子内のユニコード文字を許可して、標準準拠のコンパイラでコンパイル可能な形式でソースをエクスポートできます。IEは、基本的な文字セットでユニコードをエンコードする方法です(電子メールにはquoted-printableのようなものが使われますが、よく知っているシステムはより良い仕事をすることができ、他のシステムはまだ動作しています)。


2

キーボードや入力デバイスで入力できない外国語の文字を使用して識別子を作成したい場合があります。または、識別子にデバイスのフォントまたは出力機能を使用して印刷できない文字が含まれている可能性がありますが、IDEは正確な表現を表示する必要があります。


4
最初のケースでは、識別子はその文字を持っているようには見えないので、コードは判読できず、識別子はマシンにとって実際には重要ではありません。2つ目は、IDEでの表現は完全に別の問題です。
ジャン・ヒューデック

1

C ++では、ソースに文字どおり表示される実際の拡張文字は、ユニバーサルキャラクター名と同じように動作する必要があります。識別子に汎用文字名を許可すると、プログラマは識別子に拡張文字を使用できます。


実際の拡張文字がサポートされている場合、対応するユニバーサル文字として動作する必要があります。ただし、サポートする必要はありません。
-Jan Hudec

1
それは本当ですが、ポイントを逃します。つまり、委員会が拡張文字をサポートする実装が識別子でそれらの文字を使用することをサポートすることを指定したい場合、UCNを識別子で許可する必要があります。つまり、UCNは識別子で許可されます。必ずしも読みやすく、誰もが16進数で名前を手動でエンコードするのが好きなわけではありませんが、識別子で拡張文字の使用を許可する場合は、UCNを識別子で許可するように指定することで許可します。
bames53
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.