HP-UX から LINUX に移植しようとしているこの C++ プログラムの関数の 1 つでこの問題が発生しました。基本的に、問題と思われるのは、関数の
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
}
}
この問題を修復する方法はないかと考えていました。この警告が表示される原因がわかりません。他の Web サイトで見つけた情報によると、この警告により、コンパイルされたプログラムが予期しない動作をする可能性があるようです。これは警告ではなくエラーであるべきだと言う人もいます。この問題の原因を特定するのはあまり運がありませんでした。