18

私はCを初めて使用し、Goのソースツリーを見て、これを見つけました。

https://code.google.com/p/go/source/browse/src/pkg/runtime/race.c

void runtime∕race·Read(int32 goid, void *addr, void *pc);
void runtime∕race·Write(int32 goid, void *addr, void *pc);

void
runtime·raceinit(void)
{
    // ...
}

スラッシュとドット(・)はどういう意味ですか?これは有効なCですか?

4

4 に答える 4

19
于 2012-11-21T10:07:18.993 に答える
8

「・」文字は\xB7私のJavascriptコンソールによるものです。「∕」の文字は\x2215です。

ドットは、C99標準のAnnex Dに含まれ、Cソースで識別子として有効な特殊文字をリストします。スラッシュはそうではないように思われるので、#defineまたはプリプロセッサの魔法を介して他の何か(おそらく名前空間)として使用されているのではないかと思います。

これは、実際の関数定義にドットが存在する理由を説明しますが、スラッシュは存在しません。

編集:いくつかの追加情報については、この回答を確認してください。ユニコードスラッシュがGCCの実装によって許可されている可能性があります。

于 2012-11-20T15:07:22.107 に答える
5

これは標準のCでもC99でもないようです。特に、C99モードの場合でも、ドットについて不平gccを言います。clang

このソースコードは、Goビルドシステムによってブートストラップされたパート9コンパイラスイート(特に、OSXでは./pkg/tool/darwin_amd64/6c)によってコンパイルされます。このドキュメントによると、8ページの下部にあるPlan 9とそのコンパイラはASCIIをまったく使用していませんが、代わりにUnicodeを使用しています。9ページの下部に、十分に高いコードポイントを持つ文字は、識別子名での使用に有効であると見なされると記載されています。

前処理の魔法はまったくありません。関数の定義は、関数が異なるという理由だけで関数の宣言と一致しません。たとえば、void runtime∕race·Initialize();定義が./src/pkg/runtime/race/race.goにある外部関数です。同様にvoid runtime∕race·MapShadow(…)

後で表示void runtime·raceinit(void)される関数は、完全に異なる関数であり、実際にを呼び出すという事実とは異なりますruntime∕race·Initialize();

于 2012-11-20T17:03:03.410 に答える
3

goコンパイラ/ランタイムは、plan9用に開発されたCコンパイラを使用してコンパイルされます。ソースからgoをビルドする場合、最初にplan9コンパイラをビルドし、次にそれらを使用してGoをビルドします。

plan9コンパイラはUnicode関数名[1]をサポートしており、Go開発者は関数名にUnicode文字を疑似名前空間として使用しています。

[1]これは実際には標準に準拠しているようです。g++ユニコード変数名ですが、gccはユニコード関数/変数名をサポートしていません。

于 2012-11-21T02:56:34.150 に答える