2011-12-19 17 views
5

私はgoogleの実行時ソースコード(https://go.googlecode.com/hg/src/pkg/runtime/)を見ていましたが、それらの関数名に特殊文字を使用しているようです。 (例えば、https://go.googlecode.com/hg/src/pkg/runtime/cgocall.cを見てください)。これは主要なコンパイラで受け入れられますか?それはANSI Cではないですか?それともマクロマジックですか?Cの非ASCII文字

ありがとうございました!

+0

例を見ると、シンボルはランタイムと他の名前( 'runtime・cgocall'、' runtime・throw'、 'runtime・allm')の間にのみ現れることに気付きました。 – pmg

+0

@pmg:これは名前空間の識別子として使用されていますが、これは非常に巧妙で、非常に涼しく、非常に使いにくいと思います。 –

+2

ええと、これはANSI Cの名前空間をシミュレートするのに賢明な方法です。うまくいけば答えは、その文字が何であるかを伝えるのではなく、そうするための注意点であるかもしれません。 –

答えて

5

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は、それが標準化された前のことを知っています。

+0

識別子でさえ?または文字列の中だけ? – Waneck

+0

識別子でさえ。今追加した見積もりを参照してください。 – AProgrammer

+0

Hrm、そうです。これは私がMicrosoftのCコンパイラがC99をサポートすることを決して気にしていないので、それを処理できないと考える。 –

2

ドットを意味しますか?これは、ISO 8859-1(ISO Latin-1)の文字コード183です。これは、ジョージア語のコンマ(別名「ミドルドット」)に対応する拡張ASCIIコードです。それは実際には法的な性質です。

+0

それはANSI標準で定義されていますか? – Waneck

+0

@Waneck:拡張キャラクタセットでは、http://ascii-table.com/ansi-codes.phpです。 ANSI番号183. – Thomas

+0

0xf2 0xB7としてutf-8でエンコードされます。 – pmg

1

The C99 Standardがで指定されている「不思議なキャラクターの

5.1.1.2翻訳段階

1翻訳の構文規則の中での優先順位を(「許可」の十分に小さい値のために)「ことができます」 段階に従います。

  1. 物理ソースファイルのマルチバイト文字は、マッピングされた実装では、必要に応じて( 行末の指標のために改行文字を導入する)、ソース・キャラクタ・セットに、 方法定義されます。トリグラフシーケンスは、 に対応する1文字の内部表現に置き換えられます。中ドットがここで説明されていることを利用し
1

http://code.google.com/p/go/issues/detail?id=793

は基本的には、そのドットを使用すると、仕様の一部ではありませんが、それが必要な場合があります。ブートストラップ、ランタイム、またはアセンブリ。

+0

私は分かりません。どのようにシステムをブートストラップする必要がありますか?あなたは、おそらく、質問にリンクされているCコードではなく、Go言語について話していますか? –

+0

私はこの問題がGoogleの識別子ではなく、Googleの識別子に関係していると思います。だから、彼らはコンパイラのブートストラップについて話しているに違いありません。 – Waneck

+0

私が理解していることは、中間のドットを使う関数がすでに存在するので、Goはコールするためにcgocall.cの中のドットを使ってこれらの関数を呼び出す必要があるということです。 – Derek