24

次の警告を発している関数 (以下を参照) があります。

'va_start' の 2 番目のパラメーターは、最後の名前の引数ではありません

それは何を意味し、どのように削除するのですか?

機能は次のとおりです。

static int  ui_show_warning(GtkWindow *parent, const gchar *fmt, size_t size, ...)
    {
      GtkWidget *dialog = NULL;
      va_list args = NULL;
      int count = -1;
      char *msg = NULL;

      if((msg = malloc(size + 1)) == NULL)
        return -12;

      va_start(args, fmt);

      if((count = snprintf(msg, size, fmt, args)) < 0)
        goto outer;

      dialog = gtk_message_dialog_new(parent,
                      GTK_DIALOG_DESTROY_WITH_PARENT,
                      GTK_MESSAGE_WARNING,
                      GTK_BUTTONS_OK,
                      "%s", msg);
      (void) gtk_dialog_run(GTK_DIALOG(dialog));

      gtk_widget_destroy(dialog);

     outer: {
        if(args != NULL)
          va_end(args);

        if(msg != NULL)
          free(msg);

        return count;
      }
    }
4

4 に答える 4

27

size代わりに使用する必要がありますfmt

va_start(args, size);

ではsizeなくfmt、明示的な名前を持つ最後のパラメーターです (名前のない vararg パラメーターとは対照的に)。va_startvararg パラメータが開始するメモリ内のアドレスを把握するには、最後に名前を付けたパラメータを に渡す必要があります。

于 2012-11-02T04:36:53.860 に答える
8
second parameter of ‘va_start’ not last named argument

それは何を意味し、どのように削除するのですか?

関数には名前付きパラメーターparentfmtおよびがありsizeます。C 仕様ではva_start、古いコンパイラとの互換性のために、常に最後に名前を付けたパラメーターを に渡す必要があると述べています。sizeしたがって、合格する必要がありますfmt

(しかし、最新のコンパイラでは、とにかく動作する可能性があります)

于 2012-11-02T04:38:58.447 に答える
5

ここには混乱があると思います。ほとんどの人は、フォーマットと可変引数を持つ prinf のような関数のみを扱います。彼らは、フォーマットを記述するパラメータ名を渡す必要があると考えています。ただし、va_start は printf のような形式とは何の関係もありません。これは、名前のないパラメーターが開始するスタック上のオフセットを計算する単なる関数です。

于 2013-05-14T19:33:01.347 に答える