ホームページ  >  記事  >  バックエンド開発  >  Go の C ソース コード内のスラッシュとミッドドットは、関数の名前空間とリンクにどのように影響するのでしょうか?

Go の C ソース コード内のスラッシュとミッドドットは、関数の名前空間とリンクにどのように影響するのでしょうか?

Susan Sarandon
Susan Sarandonオリジナル
2024-11-08 12:11:01492ブラウズ

How do slashes and middots in Go’s C source code contribute to function namespacing and linking?

Go の C ソースの関数名とプロトタイプのスラッシュとドット

Go の C ソース コード (race.c ファイルで例示)、について疑問を引き起こす非標準的な文字の使用法が組み込まれています。 validity.

C 標準への拡張

Go に使用される C コンパイラは、Plan 9 C コンパイラをルーツとし、標準を拡張して UTF-8 文字をサポートします。識別子。注目すべき拡張機能の 1 つは、ミッドドット文字 (·) の特別な処理です。

ミッドドットと名前空間の分離

ミッドドットは、Go の内部リンク プロセスで名前空間の区切り文字として機能します。 UTF-8 識別子を使用して C ファイルをコンパイルすると、オブジェクト ファイルでは中点がドット (.) に変換されます。 Go リンカーは、このドットを名前空間区切り文字として解釈します。

BOM なしの UTF-8 で書かれた次の C コードを考えてみましょう:

<code class="c">void ·Bar1() {}
void foo·bar2() {}
void foo∕baz·bar3() {}</code>

このコードをコンパイルすると次のものが生成されますシンボル:

$ go tool 8c example.c
$ go tool nm example.8
T "".Bar1
T foo.bar2
T foo∕baz.bar3

「」Bar1() には Go コードから見えるように大文字の B が付いていることに注意してください。これは、結果のシンボルという点では Go 関数 "func Bar1() {}" と同等です。

「空の」名前空間

「」名前空間は次のとおりです。プレースホルダーとして使用される特別な名前空間。

<code class="go">import examp "path/to/package/example"

func main() {
    examp.Bar1()
}</code>

のように、この名前空間を使用してパッケージをインポートすると、リンカーはインポート中に "" を実際のパッケージ パスに置き換えます。したがって、リンクされたバイナリには次のシンボルが見つかります。

T path/to/package/example.Bar1

結論

Go の C ソースのスラッシュとミッドドットは標準を拡張し、名前空間を指定し、関数名を区別する方法。この規則により、Go アプリケーションの構築とリンクが容易になります。

以上がGo の C ソース コード内のスラッシュとミッドドットは、関数の名前空間とリンクにどのように影響するのでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。