C++ 临时局部变量的命名约定

C++ 临时局部变量的命名约定,c++,c,naming-conventions,C++,C,Naming Conventions,在局部函数中命名临时变量的标准方法是什么?让我给你举例说明我在做什么。我得到一个指向结构的指针,所以我想在本地存储它的一个成员,以避免取消引用,然后将任何修改分配回指针 更具体地说: struct Foo { double m_d; }; void function (Foo* f) { double tmp=f->m_d; /***Other stuff***/ f->m_d=tmp; } 我不喜欢tmp。如果我在一个函数中有很多这样

在局部函数中命名临时变量的标准方法是什么?让我给你举例说明我在做什么。我得到一个指向结构的指针,所以我想在本地存储它的一个成员,以避免取消引用,然后将任何修改分配回指针

更具体地说:

struct  Foo
{
  double m_d;

};


void function (Foo* f)
{
   double tmp=f->m_d;

       /***Other stuff***/

     f->m_d=tmp;
}
我不喜欢tmp。如果我在一个函数中有很多这样的函数,它们只会增加混乱


谢谢

对任何其他变量都要做同样的事情:给它一个简洁、富有表现力的名称。使用要复制的成员变量的原始名称(可能不使用
m
)如何?这是使两个变量之间的连接显式化的最佳方法。

tmp
变量中存储了什么?如果描述不太长,请将其用作变量名。对于三行函数(
swap
…)
tmp
。对于几乎所有其他的事情,都是描述性的。

我会称之为
保存的mu d
,或者干脆称之为
mud
(但是,我也会给
mu d
一个不同的名称)。

我对成员变量使用m\u,对局部变量不使用任何前缀。因此,在这种情况下,它将是
double d

如果想不出更具描述性的名称,我们在工作中的惯例是使用“我的[对象]”这个名称来代替更好的名称。最重要的是,使其具有描述性,以便您的代码更易于理解和维护。自我记录代码是这样做的另一个好处。

有一些“常用速记”,例如循环的i、j、m和n,但是如果你想在一个函数中有很多循环,可能最好有一些更表达的东西

在大多数情况下,我会使用好的变量命名规则。如果你正在做C++,我想问题是“我如何区分成员变量”而不是局部变量。 Linus Torvalds-:

局部变量名称应简短,切中要害。如果你有 一些随机整数循环计数器,它可能被称为“i”。 如果不可能的话,称之为“循环计数器”是无效的 被误解了。类似地,“tmp”可以是任何类型的 用于保存临时值的变量

如果你害怕混淆你的局部变量名,你有另一个 这个问题被称为生长激素功能失调综合征


一般来说,我只使用描述性名称。如果它是一个属性,我将第一个字母大写,并应用驼峰大小写。对于局部变量,我将所有内容都保持小写。对于存储属性名称的变量,我使用带有下划线的小写字母作为前缀。我避免使用任何速记符号,通常也不需要速记。代码完成对于长名称非常有用。:-)

一些IDE将使用代码高亮显示,如果您需要知道某个对象是类还是变量,这是很实用的。因此,我在类名和属性名之间没有太多区别。(在Delphi中除外,因为这是Delphi中的标准约定,所以我仍然在每个类前面加上T。)

不,我不使用tmp。我只是临时写出来,以防万一我想不出一个不同的名字。如果是索引数,则为I、J、K、L或M。(不,只有那5个字母,总是大写。)在你的情况下,我会用“oldvalue”或“oldm_d”来代替。

供你参考:有一章决定变量命名

在您的示例中,一个问题是
Foo
中的成员变量一开始不太具有描述性,这使得很难找到占位符局部变量的有用名称

例如,我会这样做:

struct Foo
{
  double mValue; // I don't use underscores here
                 // however, you can do as you please.
                 // Also 'mValue' is just for the sake of example,
                 // you should find a more descriptive name :D

};


void function (Foo* f)
{
   double oldValue = f->mValue;

       /***Other stuff***/

   f->mValue = oldValue;
}

我想说的是,试着找到最具体地描述变量用途的东西,同时将其与该函数中使用的任何其他变量区分开来

struct  Foo
{
  double m_d;

};


void function (Foo* f)
{
   double m_d_tmp = f->m_d;

       /***Other stuff***/

     f->m_d = m_d_tmp;
}
因此,假设“d”实际上表示某个已经描述了变量含义的名称,那么我将使用类似于
cached\u d
copied\u d
的名称。这样你就可以拥有更多(
cached_a
cached_b
cached_c
,等等),而不会混淆它们

然后我会进一步建议包括一条评论,具体说明你为什么制作那个本地副本。也许是这样的:

double cached_d = f->m_d;   // cached to avoid further de-referencing

这样,将来查看该代码的任何人都应该能够很容易地弄清楚您在做什么以及为什么要这样做。

我的建议是简单地合并原始变量名,或者其他一些标识符,以提醒读者它的预期功能

struct  Foo
{
  double m_d;

};


void function (Foo* f)
{
   double m_d_tmp = f->m_d;

       /***Other stuff***/

     f->m_d = m_d_tmp;
}

如果我没有男朋友怎么办。我使用的是非常旧的c代码结构?不管怎么说,这件事很臭;-)说真的,只需要理解变量。如果您保存了d的值,请随意将其保存到
old\u d
temp\u d
或任何您喜欢且对您有意义的地方。@enigma:然后使用与您复制的结构字段相同的名称即可。不会有命名冲突,因为要访问该字段,您必须显式地使用它所属的结构作为前缀。不幸的是,“用于说明”违背了问题的目的。只有给出一个现实的例子,你才能得到很好的推荐。对不起——但莱纳斯·托瓦尔兹在代码风格方面根本不是一个好的参考,请看他对
goto
对手的抨击[。在这种情况下,他(某种程度上)是对的(IMHO)但随着对权威的呼吁,这是一个谬论。我并不总是支持李纳斯的观点,但我确实同意两个样本(临时者和后藤).他在这两种情况下都说了些什么-在你理解遵守和违背这些规则的含义之前,不要盲目地遵守愚蠢的规则。而且,尽管这一点在企业机器人的世界中遭到强烈反对,但如果你处理的是心智健全的人类贝因,这一点是完全有道理的