无法通过`...'传递`const DictionaryKey'类型的对象

时间:2012-06-08 20:16:16

标签: c++ linux gcc g++ hp-ux

我的这个C ++程序中的一个函数出现了这个问题,我正在从HP-UX移植到LINUX。基本上,似乎问题在于函数

const char * Dictionary::lookup(const DictionaryKey &, ...)

gcc编译器似乎在抱怨我无法通过...

传递const Dictionary类型的对象

该程序的源代码非常陈旧,并且看起来使用了许多C风格的结构。此特定函数接受stdarg.h头中允许的变量参数列表。此外,警告仅在gcc(版本2.95.2)中针对HP-UX报告,而不是在LINUX的gcc(版本4.3.2)中报告。

$ gcc -lstdc++ foo1.cc foo2.cc
foo1.cc: In method `const char * Dictionary::lookup(const DictionaryKey &, ...)':
foo1.cc:178: warning: cannot pass objects of type `const DictionaryKey' through `...'

该功能的源代码如下:

const char *Dictionary::lookup (const DictionaryKey& key, ...)
{
  static char res[MAX_LINE];
  char *param[9];
  va_list ap;
  WordDictionary::iterator entry = dictionary.find (key);
  if (entry != dictionary.end())
  {
    int idx = 1;
    va_start (ap, key);
    while ((param[idx] = va_arg (ap, char *)) != NULL) idx++;
    va_end (ap);
    char *ts = (*entry).second.textdata;
    char *ts2 = res;
    while (*ts)
    {
      if (*ts == '$')
      {
        ts++;
        idx = *ts - '0';
        strcpy (ts2, param[idx]);
        ts2 += strlen(param[idx]);
        ts++;
      } else
      {
        *ts2++ = *ts++;
      }
    }  
    *ts2++ = 0;
    return res;
  }
  else
  {
    return key.keydata;     // Not found in dictionary
  }
}

我想知道是否有办法修复这个问题。我不明白是什么导致出现此警告。根据我在其他网站上发现的情况,此警告可能会导致编译程序出现意外行为。有些人说这应该是一个错误而不是一个警告。我没有太多运气确定这个问题的原因。

1 个答案:

答案 0 :(得分:3)

警告是正确的。您只能将POD类型作为变量参数传递 - 尝试传递非POD类型会给出未定义的行为[如果有人关心(§5.2.2/ 7):“如果参数具有非POD类类型(第9条) ),行为未定义。“]

由于您将所有其他项目视为char *,因此最好传递vector<char *>或(可能更好)vector<string>。如果你可以更新到4.7,你可以相当轻松地切换到后者,所以像:

somedict.lookup(mykey, "a", "b", "c", NULL);

会变成:

somedict.lookup(mykey, {"a", "b", "c"});