5

それが可能かどうかはわかりませんが、ここのウィキペディアの記事Compatibility of C and C++には次のように書かれています。

C では、引数のない関数プロトタイプ (例: int foo();) は、パラメーターが指定されていないことを意味します。したがって、1 つ以上の引数を指定してこのような関数を呼び出すことは正当foo(42, "hello world")です。

対照的に、C++ では、引数のない関数プロトタイプは、関数が引数をとらないことを意味し、引数を指定してそのような関数を呼び出すことは形式が正しくありません。

C では、引数を取らない関数を宣言する正しい方法は、 のように を使用することvoidです int foo(void);

次のコードを作成してテストし、渡された変数をキャッチしました (これは正しく機能しません)。

#include<stdio.h>
#include<stdarg.h>

void foo();

int main()
{
    int i = 3;
    foo(i);
    return 0;
}

void foo()
{
//    va_list args;
//    va_start(args);
//
//    int x = va_arg (args, int);
//    printf("%d", x);
//    va_end(args);
}

渡されたものをキャッチすることは可能ですか、iそれともウィキペディアはまったく別のことについて話しているのでしょうか?

4

5 に答える 5

5

少なくとも標準の C ではできません。ウィキペディアの記事が意味するのは、次のコードです。

void foo();

int main()
{
    int i = 3;
    foo(i);
    return 0;
}

void foo(int i)
{
    (void)i;
}

C では正常にコンパイルされますが、引数の数が一致しないため、C++ では無効です。

于 2013-10-30T08:58:29.393 に答える
4

ドキュメントを読むva_startと、引数リストの最後の「実際の」引数が必要であることがわかります。したがって、引数を宣言しない場合、プレーン C で引数を取得することはできません。

できることは、関数プロトタイプを引数なしで宣言し、実際の定義に引数を含めることです。

于 2013-10-30T08:55:36.700 に答える
0

C プログラムでこれらのパラメーターにアクセスする方法はありますが、私はそれを避けるべき大きなハックと見なしています。

次の例は、int パラメータにアクセスする方法を示しています。

#include<stdio.h>
#include<stdarg.h>

void foo();

int main()
{
    int i = 3;
    foo(i);
    return 0;
}

void foo(int p)
{
    printf("%d",p);
}

ここで、int 以外のもの (char* など) を渡すとどうなるかわかりませんが、未定義の動作が発生する可能性があります。

(前述のように) C++ では、パラメーターを取らない関数にパラメーターを渡すことはできません。

于 2013-10-30T09:07:44.790 に答える
0

任意の引数を指定して関数を呼び出すことができますが、関数スコープでそれらにアクセスすることはできません。いずれにせよ、プロトタイプを as として宣言しないと警告を表示するコンパイラもありますint foo (void);

于 2013-10-30T08:58:27.447 に答える