0

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 サイトで見つけた情報によると、この警告により、コンパイルされたプログラムが予期しない動作をする可能性があるようです。これは警告ではなくエラーであるべきだと言う人もいます。この問題の原因を特定するのはあまり運がありませんでした。

4

1 に答える 1

3

警告は正しいです。POD 型を可変引数としてのみ渡すことができます -- 非 POD 型を渡そうとすると、未定義の動作が発生します [誰でも気にする場合 (§5.2.2/7): 「引数に非 POD クラス型がある場合 (節 9) )、動作は未定義です。"]

渡される他のすべての項目を として扱っているので、おそらくまたはchar *を渡す方が良いでしょう(おそらくもっと良いでしょう) . 4.7 に更新できる場合は、後者に簡単に切り替えることができます。たとえば、次のようになります。vector<char *>vector<string>

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

次のようになります。

somedict.lookup(mykey, {"a", "b", "c"});
于 2012-06-08T20:23:19.350 に答える