【问题标题】:Compile error with GCC when using variable arguments使用可变参数时使用 GCC 编译错误
【发布时间】:2016-08-09 06:35:59
【问题描述】:

我有一个使用可变参数的函数,看起来像这样:

static int getIntValue(const int min,const int max,va_list *vl)
{
   int   listValue;

   listValue=va_arg(*vl,int);
   if (listValue<min) listValue=min;
   else if (listValue>max) listValue=max;
   return listValue;
}


unsigned long init_if_list(int *var,va_list vl)
{
   char *listTag;

   listTag=va_arg(vl,char*);
   if (!strcmp(listTag,INIT_SHOWUI)) initValues.uiFlags=getIntValue(INT_MIN,INT_MAX,&vl);

此代码可以很好地与 Windows/VisualStudio 2012 和“较旧”的 GCC 版本(如 CentOS 6 上的 4.7)一起编译。但是当我尝试使用 GCC 4.8.4 / Ubuntu 编译它时它失败了。在这里我得到以下错误:

error: cannot convert '__va_list_tag**' to '__va_list_tag (*)[1]' for argument '3' to 'int getIntValue(int, int, __va_list_tag (*)[1])'
   if (!strcmp(listTag,INIT_SHOWUI))                initValues.uiFlags=getIntValue(INT_MIN,INT_MAX,&vl);

有人知道这里有什么问题吗?为什么 GCC 会抱怨?

谢谢!

【问题讨论】:

  • 现在是 2016 年。为什么是可变参数?
  • 不要将va_list 参数作为指针传递?如果您仔细查看错误消息,您会发现它已经 is 是一个指针,即它是 __va_list_tag* 的类型别名 (typedef),因此您不需要使用指向模拟传递引用。
  • Orbit 中的Lightness Races:因为 DLL 接口仍然需要是纯 C,C++ 接口取决于编译器的确切版本。
  • 您使用 va_list 的方式有很多问题...

标签: c gcc variadic-functions gcc4.8


【解决方案1】:

始终按值传递va_list,从不通过指针。

因此:

static int getIntValue(const int min, const int max, va_list vl)

和

initValues.uiFlags=getIntValue(INT_MIN, INT_MAX, vl);

【讨论】:

    猜你喜欢
    • 2016-06-05
    • 1970-01-01
    • 2020-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多