无法通过"..."传递类型为"const DictionaryKey"的对象
Cannot pass objects of type `const DictionaryKey' through `...'
我在从HP-UX移植到Linux的这个C++程序中的一个函数遇到了这个问题。基本上,问题似乎是函数
const char * Dictionary::lookup(const DictionaryKey &, ...)
gcc 编译器似乎在抱怨我无法通过 const 字典传递类型的对象......
该程序的源代码非常古老,并且看起来使用了许多C风格的结构。 此特定函数接受通过 stdarg.h 标头允许的参数变量列表。 此外,该警告仅在 HP-UX 的 gcc(版本 2.95.2)中报告,而不在 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
}
}
我想知道是否有办法解决这个问题。 我不明白是什么原因导致出现此警告。 从我在其他网站上发现的情况来看,此警告似乎可能会导致编译的程序行为异常。 有些人说这实际上应该是一个错误而不是警告。 我没有太多运气确定这个问题的原因。
警告是正确的。您只能将 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"});