私はC言語で長年働いてきたので、コンパイラが通常、文字列の先頭にアンダースコアを追加するという事実extern
は理解しています...しかし、今日もまたSOの質問アンダースコアが追加された本当の理由について考えさせられました。ウィキペディアの記事理由は次の通りであると主張している。
Cコンパイラでは、ランタイム言語サポートの貢献との衝突を避けるために、すべての外部スコーププログラム識別子の先頭にアンダースコアを付加するのが一般的でした。
これには少なくとも一理あると思いますが、すべての extern にアンダースコアを追加しても衝突を防ぐのにあまり役立たないので、質問に本当に答えているわけではないようです。
先頭の下線部の根拠について、詳しい情報をお持ちの方はいらっしゃいますか?
追加されたアンダースコアは、Unix システム コールが 'e' で終わらない理由の一部ですかcreat()
? 一部のプラットフォームの初期のリンカーでは、名前に 6 文字の制限があったと聞きました。もしそうなら、外部名の前にアンダースコアを付けるというのは、まったくおかしな考えのように思えます (今では 5 文字しか使えません...)。
ベストアンサー1
Cコンパイラでは、ランタイム言語サポートの貢献との衝突を避けるために、すべての外部スコーププログラム識別子の先頭にアンダースコアを付加するのが一般的でした。
ランタイム サポートがコンパイラによって提供される場合は、ランタイム サポート内のいくつかの外部識別子の前にアンダースコアを付加する方が合理的であると考えられます。
Cコンパイラが初めて登場したとき、それらのプラットフォームでC言語でプログラミングする代わりにアセンブリ言語でプログラミングすることが基本的な選択肢でした。そして、アセンブラとCで書かれたオブジェクトファイルをリンクすることが便利でした(そして、時々今でも便利です)。そのため、実際には(私見ですが)、外部C識別子の先頭にアンダースコアを追加したのは、あなた自身のアセンブリコード。
(参照GCC のasm
ラベル拡張;そして、この先頭のアンダースコアは、名前のマングリングC++ のようなより複雑な言語では、より複雑な名前マングリングが使用されますが、これはその始まりです。