2012-06-08 2 views
0

У меня есть эта проблема с одной из моих функций в этой программе на C++, которую я переношу с HP-UX на LINUX. В принципе, то, что, как представляется, проблема заключается в том, что для функцииНевозможно передать объекты типа `const DictionaryKey 'через` ...'

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

ССАГПЗ компилятор, кажется, жаловаться, что я не могу передать объекты типа сопзЬ словарь через ...

Исходный код программы довольно старый и выглядит так, чтобы использовать множество конструкций в стиле С. Эта конкретная функция принимает переменную список аргументов, разрешенных через заголовок stdarg.h. Кроме того, предупреждение сообщается только в gcc (версия 2.95.2) для HP-UX, а не в gcc (версия 4.3.2) LINUX.

$ 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

В этом случае, однако, есть причина, почему это предупреждение не появляется в gcc LINUX во время компиляции? – Justin

Смежные вопросы