C ++ Предупреждение при повторном объявлении переменной-члена в функции - PullRequest
2 голосов
/ 08 декабря 2011

Учитывая такую ​​структуру, как показано ниже

class A {
  int test;
  void f() { int test; }
}

У меня только что был любопытный случай, когда код в f () при обращении к test, скомпилированному в VS2010, правильно ссылался на локальную переменную функции,однако при компиляции в gcc неправильно ссылается на переменную-член.Мне потребовалось немало времени, чтобы отследить.

В любом случае, вопрос в том, есть ли опция в gcc или VS для включения предупреждений компилятора каждый раз, когда переменная-член повторно объявляется в локальной области действия функции?

Ответы [ 2 ]

7 голосов
/ 08 декабря 2011

В GCC, -Wshadow.Из документации :

Предупреждать всякий раз, когда объявление локальной переменной или типа затеняет другую переменную, параметр, тип или член класса (в C ++) или всякий раз, когда встроенная функцияв тениОбратите внимание, что в C ++ компилятор не будет предупреждать, если локальная переменная затеняет struct / class / enum, но будет предупреждать, если он затеняет явный typedef.

3 голосов
/ 08 декабря 2011

Я не знаю, существует ли такая опция.

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

class A {
  int m_test;   //use some naming conventions!
  void f() { int test; }
};

То есть, используйте некоторые правила в именовании переменных-членов, например, префикс каждой с m_, как в m_test, или суффикс, как в test_. Это обычный подход, принятый многими программистами, и во многих компаниях есть аналогичные правила, которые они применяют при кодировании.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...