4

重複の可能性:
gcc では、引数なしで定義された関数に引数を渡すことができるのはなぜですか?

コード:

#include <stdio.h>
#include <stdlib.h>

void test_print()
{
    printf("test print\n");
}

int main()
{
    test_print(1,2);
    return 0;
}

main の test_print の呼び出し元は、この関数の定義によって引数の量が異なりますが、コードは非常にうまく機能しますが、C++ 版に変更すると、コンパイル エラー「関数への引数が多すぎます....」が発生します。 . なぜCは引数の不一致の関数呼び出しを許可するのですか?この呼び出し方法はいつ使用できますか? そして、なぜそれが c++ で禁止されているのか。

システム ubuntu 11.10
コンパイラ: gcc 4.6.1

4

4 に答える 4

2

あなたが書くとき:

void test_print() { ... }

関数のプロトタイプを提供していないため、コンパイラは呼び出しを引数リストと比較することは想定されていません。プロトタイプを提供するには、明示的に記述する必要がありますvoid

void test_print(void) { ... }

または、別のプロトタイプ宣言を提供します。

void test_print(void);

ただし、関数定義をプロトタイプ宣言と一致させるのが最善であるため、常にvoid. はい、これは C++ が C と異なる領域の 1 つです。スコープ内にプロトタイプがないと C では関数を使用できず、C++ は空の引数リストを空の引数リストとして扱うことができます。C99 以降では、スコープ内にプロトタイプがあるはずですが、より厳密なオプション (-Wmissing-prototypes -Wstrict-rprototypes -Wold-style-definition -Wold-style-declaration可能性のある GCC オプション) を追加しない限り、通常はコンパイラによって強制されません。しかし、標準化前の C との後方互換性要件は、C89 が「空の括弧は引数がないことを意味する」という規則を適用できなかったことを意味し、これは以前に有効だった多くの C コードを壊すことなく、標準の受け入れを妨げていたでしょう。

于 2012-12-26T06:50:00.170 に答える
0

使用する前にすべての関数が完全なプロトタイプで宣言されることを保証するコンパイラ オプションを見つけ、コンパイラ オプションを常に使用し、その警告に注意することは、優れたプログラミング規則です。

于 2012-12-26T06:48:24.227 に答える