3

私はこれに関するすべての質問を読みましたが、まだ誰も私の混乱に対処していません.

私の理解が正しければ、ライブラリ コードのメソッドまたは変数名の先頭に二重アンダースコアを使用するのは、単なる名前空間の規則です。これにより、オペレーティング システム コードがアプリケーション コードと衝突するのを回避できます。

では、なぜ my/usr/include/string.hには、たとえば次の関数宣言が含まれているのでしょうか。

extern char *strcpy (char *__restrict __dest, __const char *__restrict __src)
    __THROW __nonnull ((1, 2));

__THROWとの部分は無視し__nonnull ((1, 2));て、次の質問があります。

  • なぜ彼らはローカル変数名__dest__srcに二重アンダースコアを使用するのですか?確かにこれらは実装によってのみ到達可能であり(おそらく instring.cまたは類似)、私のコードと衝突することは決してありません. (余談ですが、前方宣言にパラメーター名が必要な理由がよくわかりませんでした。型だけで十分ではないでしょうか?)

  • 関数名が ではないのはなぜ__strcpyですか? string.hオペレーティング システムの一部としてカウントされませんか?

  • const単語と単語がrestrict二重アンダースコアを使用するように変更されているのはなぜですか? それらは C99 (またはそれ以前の?) 標準の予約語ではありませんか?

誰かが私のためにこれを片付けることができれば、それは素晴らしいことです。

4

1 に答える 1

3
  • パラメータ名は__、プログラムが定義した可能性のあるマクロと衝突しないようになっています。別のオプションは、宣言からパラメーター名を完全に省略することでした。
  • それはstrcpy、ここで宣言されている (C ライブラリの) シンボルだからです。
  • constandキーワードは、restrict誰かがまだそれらを実装していないコンパイラを使用している場合に備えて保護されています。
于 2013-04-03T13:51:50.170 に答える