给出如下结构
class A {
int test;
void f() { int test; }
}
我刚刚遇到了一个奇怪的情况,其中 f() 中的代码在引用 test 时,在 VS2010 下编译,正确引用了函数局部变量,但是,在 gcc 下编译时,错误地引用了成员变量。我花了很长时间才找到。
无论如何,问题是,gcc 或 VS 中是否有一个选项可以在每次在本地函数作用域中重新声明成员变量时启用编译器警告?
在海湾合作委员会,
-Wshadow
。来自文档:
每当局部变量或类型声明遮盖另一个变量或类型声明时发出警告 变量、参数、类型或类成员(在 C++ 中),或者每当 内置函数被遮挡。请注意,在 C++ 中,编译器不会 如果局部变量隐藏结构/类/枚举,则发出警告,但如果 它隐藏了显式的 typedef。
我不知道是否存在这样的选项。
但是如果它不存在,那么您可以执行以下操作。事实上,即使存在一些编译器选项来避免问题中的问题,命名约定也是首选,因为它涵盖了更广泛的关注领域:
class A {
int m_test; //use some naming conventions!
void f() { int test; }
};
也就是说,在命名成员变量时使用一些规则,例如在每个成员变量前面加上
m_
作为前缀,如m_test
,或者使用后缀,如test_
。这是许多程序员通常采用的方法,并且在许多公司中,他们在编码时也施加了类似的规则。
这样的命名约定不仅有助于避免您遇到的问题,还增加了可读性和可维护性,因为在没有命名约定的情况下,名称
test
并不能表明它是局部变量还是成员变量。但一旦你采用了一些命名约定,这些事情就会变得清晰。