c - 如何删除此警告 : second parameter of ‘va_start’ not last named argument?

标签 c linux gcc

我有一个函数(见下文)发出以下警告:

second parameter of ‘va_start’ not last named argument

这是什么意思以及如何删除它?

函数如下:

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;
      }
    }

最佳答案

您需要使用size 而不是fmt:

va_start(args, size);

它是 size,而不是 fmt,它是最后一个具有显式名称的参数(与没有名称的 vararg 参数相反)。您需要将最后一个命名参数传递给 va_start,以便它找出内存中可变参数开始的地址。

关于c - 如何删除此警告 : second parameter of ‘va_start’ not last named argument?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13189365/

相关文章:

c - 用于确定多个结构的最大大小的 GCC 预处理器宏

c - 意外的文件结束错误,寻找常见原因但找不到任何

linux - docker-in-docker是否使用内存或磁盘?

linux - Linux 启动/关闭时的日志脚本

linux - 在 Linux 中编译 Visual C++ 代码?

C - malloc 和结构、段错误

将 Unicode 代码点转换为 UTF-8 和 UTF-32

linux - 为什么 Aarch64 内核镜像的物理地址是非负的?

c - 为 __uint128 数字预处理 C 十六进制字符串

c - gcc编译和Make文件错误