给出如下面的结构
class A {
int test;
void f() { int test; }
}
我刚才有一个奇怪的例子,其中f()中的代码,当引用在VS2010下编译的test时,正确地引用了函数局部变量,但是,当在gcc下编译时,错误地引用了成员变量。我花了很长时间才追查。
无论如何,问题是,每次在本地函数范围内重新声明成员变量时,gcc或VS中是否有一个选项可以启用编译器警告?
答案 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
在没有命名约定的情况下建议无论是局部变量还是成员变量。但是一旦你采用了一些命名约定,这些事情就会变得清晰。