2012-06-08 38 views
0

我正在將此C++程序中的某個函數用於從HP-UX移植到LINUX中,這個問題存在。基本上,什麼似乎是問題是,對於功能無法通過`...'傳遞類型爲'const DictionaryKey'的對象

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 
    } 
} 

我想知道是否有修復此問題的方式。我不明白是什麼導致這個警告出現。從我在其他網站上發現的情況看,此警告可能會導致編譯後的程序出乎意料地行爲。有些人說這應該是一個錯誤,而不是一個警告。我沒有太多的運氣來確定這個問題的原因。

回答

3

警告是正確的。你只能通過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"}); 
+0

+1。而今天我的新事實。 –

+0

謝謝一堆。我會試試這個解決方案。 – Justin

+0

在這種情況下,是否有理由在編譯期間在LINUX的gcc中不顯示此警告? – Justin

相關問題