我从 HP-UX 移植到 LINUX 的这个 C++ 程序中的一个函数有这个问题。基本上,问题似乎在于函数
const char * Dictionary::lookup(const DictionaryKey &, ...)
gcc 编译器似乎在抱怨我无法通过...传递 const Dictionary 类型的对象
该程序的源代码相当陈旧,看起来使用了很多 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
}
}
我想知道是否有办法解决这个问题。我不明白是什么导致出现此警告。从我在其他网站上发现的情况来看,这个警告似乎可能导致编译后的程序出现意外行为。有人说这应该是一个错误而不是一个警告。我没有太多运气确定这个问题的原因。