【问题标题】:Is it a bad practice to have local variable name same as parameter name in c?将局部变量名称与 c 中的参数名称相同是一种不好的做法吗?
【发布时间】:2021-09-19 12:02:26
【问题描述】:

例如,在下面的代码范围内,局部变量 num 应该只在 else 中,但这是一个不好的做法吗?

typedef enum
{
   FIRST,
   SECOND,
   THIRD,
} numbers;

void fun(int check, numbers *num)
{
    if (check)
    {
    ..........
    .......
    }
    else
    {
        numbers num;
        ............
    }
}

【问题讨论】:

  • 这绝对是不必要的混乱和错误行程。为什么要这样做?
  • 通常这是不好的做法。唯一的例外是当您传递了一个结构并需要初始化它的成员时。然后,您可以将参数命名为与结构成员相同的名称,因为它们位于不同的命名空间中。

标签: c scope local-variables


【解决方案1】:

人 gcc

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

【讨论】:

  • 那你的回答是yes还是no?另外问题是关于 C,而不是 C++。
【解决方案2】:

我会说是的,绝对是不好的做法。当然它会起作用,所以从编译器/程序的角度来看,这种方法本质上没有任何问题。不管你的项目变得更大更复杂,保持这种做法肯定会导致更难的调试阶段、半模糊的可读性和更糟糕的文档。 如果你这样做并在几个月后拿起你的复杂软件,你会讨厌自己:)

软件中的命名是一个敏感话题,每个开发人员都有自己的标准和个人偏好。我自己尝试编写不言自明的代码。使用易于理解的长描述性变量/函数名称是我的首选。

您可能会在各种代码标准(例如 SEIBarr)中找到更多关于为什么要避免某些事情的原因。

【讨论】:

    【解决方案3】:

    名称完全匹配是不好的做法,但是,我经常看到并使用相同的名称,但类型具有大写字母:

    void func(Person person) { };
    

    类型和变量有完全不同的工作,你希望能够看到差异。此外,您希望 IDE 能够“查找所有引用”或跳转到该类。即使语言本身并不介意,一些框架也依赖大小写来使事情正确。

    从纯语言的角度来看,随着程序变得越来越大,您会变得更加困惑,并且您开始尝试在 IDE 中滚动或使用“查找”或跳转到。即使没有 IDE 问题,您也不知道在任何给定时间发生了什么,并且您最终可能会编辑错误的代码部分以修复其他地方的错误。

    我想在很多书中补充一点,我看到构造函数是这样写的:

    private int x, y;
    
    MyClass(int x, int y) {
      this.x = x;
      this.y = y;
    }
    

    我个人不喜欢这样,但这似乎是两者之间的选择,或者更改私有变量名称。微软喜欢加下划线。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-08-05
      • 2016-06-28
      • 1970-01-01
      • 1970-01-01
      • 2017-10-20
      • 2021-05-31
      • 1970-01-01
      相关资源
      最近更新 更多