gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 09:06:10 25 4
gpt4 key购买 nike

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

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

gcc 编译器似乎在提示我无法通过 ... 传递类型为 const Dictionary 的对象

该程序的源代码非常古老,看起来使用了大量 C 风格的结构。此特定函数接受 stdarg.h header 允许的可变参数列表。此外,该警告仅在 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"});

关于c++ - 无法通过 `const DictionaryKey' 传递类型为 `...' 的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10955529/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com