Eclipse C ++ проблема предупреждения компиляции - PullRequest
4 голосов
/ 02 августа 2009

Вот код, демонстрирующий раздражающую проблему:

class A {
public:
    A():
        m_b(1),
        m_a(2)
        {}
private:
    int m_a;
    int m_b;
};

Это вывод на Консоль view:

make all 
Building file: ../test.cpp
Invoking: GCC C++ Compiler
g++ -O0 -g3 -Wall -c -fmessage-length=0 -MMD -MP -MF"test.d" -MT"test.d" -o"test.o" "../test.cpp"
../test.cpp: In constructor 'A::A()':
../test.cpp:9: warning: 'A::m_b' will be initialized after
../test.cpp:8: warning:   'int A::m_a'
../test.cpp:3: warning:   when initialized here
Finished building: ../test.cpp

Проблема в том, что в представлении Задачи я вижу 3 отдельных предупреждения (строки в выходных данных, содержащие слово предупреждения), в то время как в выходных данных есть 4 строки, описывающие одну проблему.

Есть что-то, что я пропускаю?

Дополнительный вопрос. Может быть, это в духе Eclipse, но есть ли способ сделать Консоль представление кликабельным, как это делает большинство IDE (например, Visual Studio, emacs ...)

Спасибо Дима

Ответы [ 5 ]

6 голосов
/ 02 августа 2009

В предупреждении несколько строк, поскольку каждая строка относится к отдельной строке кода. Проблема, о которой предупреждают, заключается в том, что происходит с m_b, объявленным в строке 9, это , потому что того факта, что m_a в строке 8 объявлено до того, как m_b , но это вызвано тем, что происходит в вашем списке инициализатора, который начинается в строке 3.

С помощью gcc предупреждения, которые не связаны друг с другом, могут появляться одно за другим (т. Е. Куча несвязанных вещей, неправильных в main), поэтому Eclipse не может определить из выходных данных, это отдельные предупреждения или все они относятся к одной и той же проблеме.

1 голос
/ 28 февраля 2010

Согласно последнему комментарию к этому сообщению об ошибке , вы должны иметь возможность щелкнуть на представлении консоли, чтобы перейти к коду в CDT 7.0.

Возможно, стоит проверить вехуСборки, чтобы увидеть, если группировка сообщений об ошибках лучше.Если бы не возникла ошибка, попытка сгруппировать связанные сообщения была бы хорошей идеей.

0 голосов
/ 02 марта 2010

Я полагаю, это потому, что CDT все еще немного незрелый и, вероятно, он не может анализировать вывод g ++ наилучшим из возможных способов. Строка ../test.cpp: In constructor 'A::A()': не содержит номера строки, поэтому CDT не может поместить маркер ошибки в редакторе test.cpp, и, вероятно, эта проблема влияет на представление Проблемы .

Есть еще проблемы с Проблемы просмотра. Например, вы можете удалить только видимые ошибки из представления, поэтому, если вы получите более 100 элементов по умолчанию, вам придется последовательно удалять их сто на сотню. Также ошибки не удаляются автоматически после очистки, если ошибка произошла внутри независимого заголовочного файла. Просто будьте снисходительны, они улучшают CDT от выпуска к выпуску.

Дополнительный вопрос - что вы подразумеваете под "сделать так, чтобы в консоли было кликабельно"?

0 голосов
/ 03 ноября 2009

Спасибо, Дэвид, но я думаю, вы меня не так поняли. Я имел в виду тот факт, что представление «Проблемы» в eclipse по умолчанию сортирует ошибки компилятора в алфавитном порядке. Как говорил Дима, это вызывает проблемы с сообщениями об ошибках gcc, которые разбросаны по двум строкам, таким как

  1. ошибка: «такой-то и такой-то» защищен
  2. в этом контексте

поскольку все строки «в этом контексте» отделены от переменной, на которую они ссылаются.

ОДНАКО, я только что нашел возможность изменить порядок сортировки ошибок компилятора, маленький треугольник, направленный вниз, вверху представления (только что сработало, это когда вы устанавливаете параметры для представления, как я новый затмить). Если вы поэкспериментируете с этим, это поможет, но все равно не сможет остановить ошибки в одном и том же файле от смешения (почему нет возможности просто оставить их такими, как они были?)

0 голосов
/ 03 ноября 2009

Поля инициализируются в порядке их объявления в классе. Компилятор помогает вам, сообщая, что конструктор инициализируется в неправильном порядке. Это может вызвать странные ошибки, если порядок инициализации имеет значение.

...