【问题标题】:C++ Warning if re-declaring member variable in function如果在函数中重新声明成员变量,C++ 警告
【发布时间】:2012-01-15 23:13:39
【问题描述】:

给定如下结构

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

我刚遇到一个奇怪的情况,f() 中的代码在引用 test 时,在 VS2010 下编译时,正确地引用了函数局部变量,然而,在 gcc 下编译时,错误地引用了成员变量。我花了很长时间才找到。

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

【问题讨论】:

  • 我建议不要使用相同的名称,而不要尝试查找编译器开关。
  • @cookie - 它给你一个警告是有原因的 - 即你无意中隐藏了一些东西。改个名字就行了! (顺便说一句,你应该找到编译器开关来给你尽可能多的警告 - 编写编译器的人会比你或我更了解语言的来龙去脉)
  • @crashmstr:这正是重点。您将如何查找代码库中的所有匹配项?
  • @cookie - 但它给你警告是有原因的。
  • @EdHeal:让我再说一遍。我没有收到任何形式的警告

标签: c++ compiler-construction scope declaration


【解决方案1】:

在 GCC 中,-Wshadow。来自documentation

当一个局部变量或类型声明遮蔽另一个时发出警告 变量、参数、类型或类成员(在 C++ 中),或者无论何时 内置函数被遮蔽。请注意,在 C++ 中,编译器不会 如果局部变量遮蔽了结构/类/枚举,则发出警告,但如果出现则发出警告 它隐藏了一个明确的 typedef。

【讨论】:

  • 唯一的问题是它还抱怨构造函数中的阴影名称
【解决方案2】:

我不知道是否存在这样的选项。

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

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

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

这样的命名约定不仅有助于避免您遇到的问题,而且还增加了可读性和可维护性,因为在没有命名约定的情况下,test 这个名称并没有暗示它是局部变量还是成员变量。但是一旦你采用一些命名约定,这些事情就会变得清晰。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-02
    • 1970-01-01
    • 2012-12-13
    • 1970-01-01
    相关资源
    最近更新 更多