0

f次のように定義された関数があります。

struct s {
    void *data;
    struct s *next;
};

void
f(struct s **p, void *q)
{
    /* ... */
}

void *
g(struct s **p)
{
    /* ... */
}

多くの異なる引数を使用して、これらの関数をテストする必要があります。しかし、へのポインタにvoidはオブジェクトアドレスしか含めることができませんよね?では、一時変数を使用せずに(またはマクロで)、次のように操作を自動化するにはどうすればよいですか。

f(p, 2);
f(p, 'c');
f(p, 3.14);
4

3 に答える 3

2

アドレスが必要であり、したがって(非レジスタ)変数が必要なため、一時変数を回避する方法はありません(静的変数を使用できますが、一時変数ではありません!)。

ただし、これは追加のコード行が必要であることを意味するわけではありません。型付き初期化子を使用できます(C99以降)。

f(p, &(int){2});
f(p, &(double){3.14});

ただし、関数(定義したとおり)には、渡したばかりのオブジェクトの大きさを知る方法がなく、非常に一時変数へのポインターであるため、ポインター値を格納するだけではいけません。

(整数はポインターに変換して、いくつかの制限付きで元に戻すことができますが、詳細については実装を確認する必要があります。)

于 2012-09-02T15:05:11.483 に答える
1

同様の方法で引数を受け入れるこのスレッドの例を見ることができます。

_beginthread( Bounce, 0, (void *) (structure_of_whatever_variables)  );
                            ^
                            |
                            |
                       This is the parameter of function Bounce

これは上記の例のソースです。

于 2012-09-02T15:05:53.497 に答える
1

テスト変数の配列を作成し、forループを作成して1つずつ呼び出します。そうすれば、アドレスを直接送信できるようになります。おそらく、次のように機能するはずです。

for (int i = 0; i < NumOfTestCases; i++)
{
    f(p, &pArrOfTestCases[i]);
}

それがお役に立てば幸いです。

于 2012-09-02T15:10:05.943 に答える