1

ISO/IEC 9899:TC3 6.9.1 を読んだとき -> 例 13

そしてメモ:

extern int max(int a, int b)
{
    return a > b ? a : b;
}

[...]

extern int max(a, b)
int a, b;
{
    return a > b ? a : b;
}

ここで int a, b; パラメータの宣言リストです。これら 2 つの定義の違いは、最初の形式は関数への後続の呼び出しの引数の変換を強制するプロトタイプ宣言として機能するのに対し、2 番目の形式はそうしないことです。

そこで、そのようにコンパイルするための独自のテスト コードを作成しました。(私は、両方の方法を前に宣言する必要があるか、とにかく言及された型定義でプロトタイプを作成する必要があると考えました)

size_t foo (size_t a, size_t b);

int main(int argc, char** argv)
{
    /*some call to foo*/
    return 0;
}

だから私は今尋ねています:この方法の間にパフォーマンス関連の違いはありますか:

size_t foo (a, b)
size_t a, b;
{   
    return a > b ? a : b;
}

そしてこれは?

size_t foo (size_t a, size_t b)
{   
    return a > b ? a : b;
}

私が理解しているように、最初の方法では関数呼び出しで複数の変換が回避されるため、違いがあります。これは、型が型になることが保証されているため、パラメーター型への変換が必要ないためです (この場合) size_t.

しかし、プロトタイプは両方の場合で似ている必要があり、プロトタイプはコンパイラが処理を行うソースであると考えたので、混乱しました。

だから:違いは正確には何ですか?また、ある場合、なぜ最初の方法はめったに (決して) 見られないのでしょうか?

4

3 に答える 3

0

この方法

size_t foo (a, b)
size_t a, b;
{   
    return a > b ? a : b;
}   

関数の定義は K&R C に由来するため、古い本やプログラムでこれに遭遇する可能性があります。C89 と C99 はこのスタイルをサポートしています。プログラマーは、いくつかの理由から、新しいプログラムでこれを使用することを避けています。

まず、古い方法で定義された関数は、同じ程度のエラー チェックを受けません。関数が古い方法で定義されていて、プロトタイプが存在しない場合、コンパイラは関数が正しい数の引数で呼び出されていることを確認せず、引数の型が適切であることも確認しません。代わりに、デフォルトの引数 Promotion を実行します

2番目:6.11.6関数宣言子は言う

括弧が空の関数宣言子 (プロトタイプ形式のパラメーター型宣言子ではない) の使用は、廃止された機能です。

于 2013-09-24T13:52:19.177 に答える