私はgoogleの実行時ソースコード(https://go.googlecode.com/hg/src/pkg/runtime/)を見ていましたが、それらの関数名に特殊文字を使用しているようです。 (例えば、https://go.googlecode.com/hg/src/pkg/runtime/cgocall.cを見てください)。これは主要なコンパイラで受け入れられますか?それはANSI Cではないですか?それともマクロマジックですか?Cの非ASCII文字
ありがとうございました!
私はgoogleの実行時ソースコード(https://go.googlecode.com/hg/src/pkg/runtime/)を見ていましたが、それらの関数名に特殊文字を使用しているようです。 (例えば、https://go.googlecode.com/hg/src/pkg/runtime/cgocall.cを見てください)。これは主要なコンパイラで受け入れられますか?それはANSI Cではないですか?それともマクロマジックですか?Cの非ASCII文字
ありがとうございました!
C90では、識別子(基本文字セットのものよりも)、C99 do(ユニバーサル文字構文-uXXXXと\ UXXXXXXXXの両方、および他の文字の実装定義セット) 。 C99で
6.4.2.1/1:
identifier:
identifier-nondigit
identifier identifier-nondigit
identifier digit
identifier-nondigit:
nondigit
universal-character-name
other implementation-defined characters
nondigit: one of
_ 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
digit: one of
0 1 2 3 4 5 6 7 8 9
私はそれがCの実装によってサポートされている方法も知りませんが、私はPlan9のCコンパイラcould handle other charactersは、それが標準化された前のことを知っています。
識別子でさえ?または文字列の中だけ? – Waneck
識別子でさえ。今追加した見積もりを参照してください。 – AProgrammer
Hrm、そうです。これは私がMicrosoftのCコンパイラがC99をサポートすることを決して気にしていないので、それを処理できないと考える。 –
The C99 Standardがで指定されている「不思議なキャラクターの
5.1.1.2翻訳段階
1翻訳の構文規則の中での優先順位を(「許可」の十分に小さい値のために)「ことができます」 段階に従います。
- 物理ソースファイルのマルチバイト文字は、マッピングされた実装では、必要に応じて( 行末の指標のために改行文字を導入する)、ソース・キャラクタ・セットに、 方法定義されます。トリグラフシーケンスは、 に対応する1文字の内部表現に置き換えられます。中ドットがここで説明されていることを利用し
:
http://code.google.com/p/go/issues/detail?id=793
は基本的には、そのドットを使用すると、仕様の一部ではありませんが、それが必要な場合があります。ブートストラップ、ランタイム、またはアセンブリ。
例を見ると、シンボルはランタイムと他の名前( 'runtime・cgocall'、' runtime・throw'、 'runtime・allm')の間にのみ現れることに気付きました。 – pmg
@pmg:これは名前空間の識別子として使用されていますが、これは非常に巧妙で、非常に涼しく、非常に使いにくいと思います。 –
ええと、これはANSI Cの名前空間をシミュレートするのに賢明な方法です。うまくいけば答えは、その文字が何であるかを伝えるのではなく、そうするための注意点であるかもしれません。 –