C ++警告如果在函数中重新声明成员变量

时间:2011-12-08 14:14:43

标签: c++ compiler-construction scope declaration

给出如下面的结构

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

我刚才有一个奇怪的例子,其中f()中的代码,当引用在VS2010下编译的test时,正确地引用了函数局部变量,但是,当在gcc下编译时,错误地引用了成员变量。我花了很长时间才追查。

无论如何,问题是,每次在本地函数范围内重新声明成员变量时,gcc或VS中是否有一个选项可以启用编译器警告?

2 个答案:

答案 0 :(得分:7)

在GCC,-Wshadow。来自documentation

  

每当局部变量或类型声明影响另一个变量时发出警告   变量,参数,类型或类成员(在C ++中),或者每当一个   内置函数被遮蔽。请注意,在C ++中,编译器不会   如果局部变量影响struct / class / enum,则会发出警告,但会发出警告   它会影响一个明确的typedef。

答案 1 :(得分:3)

我不知道是否存在任何此类选项。

但如果它不存在,那么您可以执行以下操作。实际上,即使存在一些编译器选项来避免问题中的问题,也可以使用命名约定,因为它涵盖了更广泛的关注领域:

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

也就是说,在命名成员变量时使用一些规则,例如,在m_中使用m_test作为前缀,或者在test_中使用后缀。这是许多程序员采用的常用方法,在许多公司中,编码时会有类似的规则。

此类命名约定不仅有助于避免遇到的问题,而且还提高了可读性和可维护性,因为名称test在没有命名约定的情况下建议无论是局部变量还是成员变量。但是一旦你采用了一些命名约定,这些事情就会变得清晰。