2014-01-30 1 views
0

Вот минимальный пример:Как получить GCC для предупреждения об именах имен идентификаторов?

#include <algorithm> 
#include <vector> 
using namespace std; 

vector<int> count; 

int main() { 
    int(count.size()); 
    return 0; 
} 

компиляции с

$ \g++ --std=c++0x -ggdb -D_GLIBCXX_DEBUG -W -pipe \ 
     -mmmx -msse -msse2 -msse3 \ 
     -ftrapv -Wall -Wextra \ 
     -Wctor-dtor-privacy -Wlogical-op -Wnoexcept \ 
     -Woverloaded-virtual  -Wsign-promo -Wstrict-null-sentinel \ 
     -Wstrict-overflow=5  -Wundef  -Weffc++ \ 
     -Wcast-align \ 
     -Wcast-qual  -Wchar-subscripts -Wcomment \ 
     -Wconversion \ 
     -Wdisabled-optimization -Wfloat-equal \ 
     -Wformat \ 
     -Wformat=2 -Wformat-nonliteral  -Wformat-security \ 
     -Wformat-y2k  -Wimport -Winit-self  -Winline \ 
     -Winvalid-pch -Wunsafe-loop-optimizations \ 
     -Wmissing-braces -Wmissing-field-initializers \ 
     -Wmissing-format-attribute  -Wmissing-include-dirs \ 
     -Wmissing-noreturn -Wpacked -Wpadded \ 
     -Wpointer-arith \ 
     -Wredundant-decls -Wreturn-type -Wsequence-point \ 
     -Wshadow \ 
     -Wsign-compare -Wstack-protector \ 
     -Wstrict-aliasing \ 
     -Wstrict-aliasing=2 -Wswitch -Wswitch-default \ 
     -Wswitch-enum  -Wtrigraphs  -Wuninitialized \ 
     -Wunknown-pragmas -Wunreachable-code \ 
     -Wvolatile-register-var -Wwrite-strings -Wunused-parameter \ 
     -Wno-parentheses d.cpp 

т.е. большинство предупреждающих флагов, которые я получил от какого-то другого вопроса, я получаю:

d.cpp: In function 'int main()': 
d.cpp:7:5: error: expected primary-expression before 'int' 
    int(count.size()); 
    ^
d.cpp:7:5: error: expected ';' before 'int' 

Status 1 

Ясно , он запутался, потому что count объявлен в <algorithm>. Но сообщение об ошибке не показывает этого.

Было бы замечательно, если бы было предупреждение о том, что вектор имеет то же имя, что и функция. Есть ли такое предупреждение?

Удаление using namespace std; устраняет проблему, но есть ли предупреждение, которое все еще работает в присутствии using namespace std;? Все, что нужно сделать, это следить за символами в текущем контексте, которые уже выполняются компиляторами, и выдать предупреждение, если оператор тени или переопределяет его. Похоже на простую функцию, я не могу поверить, что она этого уже не делает.

+1

Если удаление директивы 'abusing namespace' решает проблему, удалите ее. В любом случае, это приносит больше вреда, чем пользы. –

+0

Ну, это то, что вы получаете для импорта нескольких вещей в одно и то же пространство имен. Вот почему использование пространства имен обычно не рекомендуется. – PlasmaHH

+1

Нет, мне нужно это, чтобы иметь возможность печатать быстрее. @PlasmaHH Вы уверены, что в этом причина? Для меня это не слишком сильная причина. –

ответ

2

Clearly, it got confused because count is declared in . But the error message doesn't reveal that.

Используйте что-то другое, кроме gcc, и вы увидите сообщения об ошибках. Сообщения об ошибках от gcc немного улучшились, но это не говорит о многом. Сообщения об ошибках от gcc были известны за отсутствие ясности. Сообщение от клана гораздо яснее в этом отношении. Он рассказывает о двух кандидатах, которые он не может различить, один из которых - count.size(), где «count» - это вектор, который вы объявили, а другой - std::count.size(), где std::count определен в заголовке <algorithm>.

Решение этой проблемы прост: избавиться от этой инструкции using namespace std и избавиться от посторонних директив #include. Стоит почти ничего не печатать std::vector<int>, а не vector<int>. Ввод этих дополнительных пяти символов сохраняет много времени вниз по течению, когда код нужно понимать и поддерживать другим. То, что «кто-то еще» вполне может быть вам через полгода, когда вы больше не понимаете, что сделал ваш код.

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