2

今日の初めに、私が作成しているものと比較するためだけにさまざまなヘッダー ファイルを調べていたところ、関数の宣言が少し異なっているように見えることに気付きました。

たとえば、strlenfromの宣言は次のstring.hとおりです。

extern size_t __cdecl strlen(const char *);

いくつかの調査を行ったところextern、関数ブロックの外側で変数を宣言するためのものであることがわかりました。ヘッダー ファイルでも関数を宣言するのがベスト プラクティスexternですか?

size_tの代わりにwhich is unsigned long longhereを使用しているように見えますintが、これはいくつかの理由 (たとえば、文字列の長さが負の数になることは決してない) により効率的であるためだと推測していますが、それが彼らがsize_tここで使用する理由ですか? それとも私はポイントを完全に逃していますか?

そして最後に__cdecl、あまり情報が見つからないものを見つけます。__cdecl正確には何ですか?私もそれを使うべきですか?

最後に、この宣言には、 に渡される引数の変数名がないことに気付きましたstrlen。この理由は、これが関数のプロトタイプではなく単なる宣言であり、プロトタイプが別の場所にあるためだと推測しています。strlen(const char *str)宣言などに変数名がないのはなぜですか?

最後の質問は、これが単なる宣言である場合、strlen の関数プロトタイプはどのようになるでしょうか? 私の推測は次のようなものです:

size_t strlen(const char *str)

コードを学習して改善したいので、質問しているだけです(Cファイルで関数プロトタイプ/宣言を作成し、ヘッダーファイルで関数宣言を作成して、他のCファイルがそれらを利用できると仮定します)。

4

4 に答える 4

6
  1. size_tより適切な戻りstrlenint
  2. __cdecl関数の呼び出し規約です。これは、誰がパラメータ、戻り値などのスタックを設定し、誰がそれをクリアするかを示します。詳細:呼び出し規約
  3. 関数を宣言するとき、実際にはパラメーター名は必要ありません。パラメータの型だけで十分です。

の更新extern:

  • externステートメントが単なる宣言であり、定義ではないことをコンパイラーに伝えます。したがって、関数プロトタイプのextern場合、それはすでに単なる定義であるため、値を追加しません。参考:Cエクスターン

お役に立てれば。

于 2012-08-27T17:40:26.763 に答える
1

関数を宣言する場合、externキーワードは冗長です。これは、他の場所で定義する必要があることが明らかであるためです。同じことは、宣言と定義の間に違いがない変数には当てはまりませんextern

于 2012-08-27T17:54:46.750 に答える
1

size_t strlen返すように定義されているものです。あなたの場合、理論的には文字列がint.

__cdecl標準ライブラリをコンパイルするときに使用される呼び出し規則です。プログラムに別の呼び出し規則を選択する必要がある場合 (いくつかのコンパイラ オプションを使用)、プリコンパイルされたライブラリ関数は引き続き正しい規則を使用します。

ほとんどの場合、関数宣言のすべてのパラメーターに名前を付けます。これは、それらが何であるかを文書化するのに役立つためです。あまり役に立ちint f(int, int, int, int)ませんが、コンパイラには十分です。したがって、名前はオプションです。

于 2012-08-27T17:56:59.000 に答える
1

@Rohanが言ったようにsize_tについては、サイズを保持していたタイプです。たとえば、負になることはできません。これは主に、いくつかのセキュリティ上の問題が原因です。(たとえばgetpeername、size_t の代わりに int を使用することによって引き起こされる FreeBSD のセキュリティの脆弱性)
cdecl については、これが役立つかもしれません ( PC アセンブリブックからのものです):

Borland と Microsoft は、共通の構文を使用して呼び出し規約を宣言しています。cdecl および stdcall キーワードを C に追加します。これらのキーワードは関数修飾子として機能し、プロトタイプの関数名の直前に表示されます。たとえば、関数 f は Borland と Microsoft の場合、次のように定義されます。

void __cdecl f ( int );

それぞれの呼び出し規約には長所と短所があります。cdecl 規則の主な利点は、単純で非常に柔軟であることです。どのタイプの C 関数および C コンパイラにも使用できます。他の規則を使用すると、サブルーチンの移植性が制限される可能性があります。その主な欠点は、他のものよりも遅く、より多くのメモリを使用する可能性があることです (関数を呼び出すたびに、スタック上のパラメーターを削除するコードが必要になるため)。

stdcall 規則の利点は、cdecl よりもメモリ使用量が少ないことです。CALL 命令の後にスタックのクリーンアップは必要ありません。その主な欠点は、可変数の引数を持つ関数では使用できないことです。[いいねprintf]

于 2012-08-27T17:58:12.277 に答える