0

私はこの関数を持っています:
void func(int a, int b, char s, FILE *fp, int flag)
そして私はフラグに基づいて関数の引数を使用したいと思います。例: そして私が欲しい
func(num, NOTHING, NOTHING, file, 1)
func(num, othernum, NOTHING, NOTHING, 2)
関数について:this_is_function

void func(int a, int b, char s, FILE *fp, int flag){
if(flag == 1){
/* use a and file */
}
if(flag == 2){
/* use a,b */
}
/* etc etc */
}

それが可能かどうか、そしてこれを行う方法を知りたいです!
前もって感謝します :)

4

4 に答える 4

4

NOTHINGあなたが本当にその議論を省略したいということを意味するならば、私はあなたがそれを概説した方法でそれが可能であるとは思わない。

これがCで通常行われる方法は、可変引数リストを使用することです。つまりflag、残りの引数を決定するので、が最初になるように再定式化する必要があります。

void func(int flag, ...)
{
  va_list args;
  int num, othernum;
  FILE *file;

  va_start(args, flag);
  if(flag == 1)
  {
    num = va_arg(args, int);
    file = va_arg(args, FILE *);
  }
  else if(flag == 2)
  {
    num = va_arg(args, int);
    othernum = va_args(args, int);
  }
  va_end(args);

  /* Inspect `flag` again, and do things with the values we got. */
}

次に、次のような関数を使用できます。

func(1, 42, a_file);

また

func(2, 17, 4711);

もちろん、これには多くの注意が必要です。これは、呼び出しで提供された値を関数が期待する値に一致させるために、コンパイラーから多くの助けを得ることができなくなったためです。

代わりに、適切な引数を使用して一般的な「ワーカー」関数を呼び出す、別のトップレベル関数に再構築することをお勧めします。

func_mode1(42, a_file);
func_mode2(17, 4711);

func()次に、これらは適切な値で呼び出すことができ、flag適用されない引数(NULL未使用のファイルポインタなど)に適切なデフォルトを入力します。

于 2012-06-29T12:54:02.077 に答える
2

処理しようとしているケースごとに個別の関数を作成します。これにより、より読みやすいコードが得られます。コードをハックするのではなく、コードを通して意図を述べてください。

于 2012-06-29T12:54:06.073 に答える
2

関数を呼び出し、引数が使用されていない場合は、ポインターとポインターを渡すことができ0ます。intcharNULL

func(num, 0, 0, file, 1)
func(num, othernum, 0, NULL, 2)

可変個引数関数を使用することもできます。可変個引数関数は、引数の数が可変の関数です。

于 2012-06-29T12:54:32.750 に答える
1

コードは正常に機能するはずです。さらに、一度試してエラーがないか確認してください。エラーは発生しないはずです。また、 forとしてswitchfuncでcaseを使用してみることができます。私はあなたがあなたのコードでそしてあなたのコードで使うつもりはないと確信しています。flagchoiceswitchNothingothersum

于 2012-06-29T12:57:23.227 に答える