我经常在教程、示例和其他与游戏开发相关的代码中看到m_前缀用于变量(m_World、m_Sprites等)。
为什么人们在变量前加前缀m_ ?
我经常在教程、示例和其他与游戏开发相关的代码中看到m_前缀用于变量(m_World、m_Sprites等)。
为什么人们在变量前加前缀m_ ?
当前回答
正如在其他答案中所述,m_ prefix用于表示变量是类成员。这与匈牙利符号不同,因为它没有指出变量的类型,而是它的上下文。
我在c++中使用m_,但在其他一些必须使用“this”或“self”的语言中不使用。我不喜欢看到'this->'与c++一起使用,因为它会使代码混乱。
另一个答案说m_dsc是“坏做法”和“description;”是“好做法”,但这是一个转移注意力的问题,因为这里的问题是缩写。
另一个答案是,输入这个会弹出智能提示,但任何好的IDE都会有一个热键来弹出当前类成员的智能提示。
其他回答
正如在其他答案中所述,m_ prefix用于表示变量是类成员。这与匈牙利符号不同,因为它没有指出变量的类型,而是它的上下文。
我在c++中使用m_,但在其他一些必须使用“this”或“self”的语言中不使用。我不喜欢看到'this->'与c++一起使用,因为它会使代码混乱。
另一个答案说m_dsc是“坏做法”和“description;”是“好做法”,但这是一个转移注意力的问题,因为这里的问题是缩写。
另一个答案是,输入这个会弹出智能提示,但任何好的IDE都会有一个热键来弹出当前类成员的智能提示。
我还没有看到的一个参数是,像m_这样的前缀可以用来防止与#define'd宏的名称冲突。
在/usr/include/term.h查找curses/ncurses中的#define [a-z][A-Za-z0-9_]*[^(]
在《干净代码:敏捷软件工艺手册》中,明确建议不要使用这个前缀:
你也不再需要给成员变量加上m_前缀了。你的类和函数应该足够小,以至于你不需要它们。
这里还有一个例子(c#代码):
坏的做法:
public class Part
{
private String m_dsc; // The textual description
void SetName(string name)
{
m_dsc = name;
}
}
良好实践:
public class Part
{
private String description;
void SetDescription(string description)
{
this.description = description;
}
}
在显式歧义(即,描述成员和描述形参)的情况下,我们使用语言构造来引用成员变量:this。
还有人提到它的意思是一个阶级成员。Qt是一个流行的c++框架,它使用了这个符号,所以很多c++ GUI教程都使用m_。你可以看到他们几乎所有的例子都使用m_作为类成员。就我个人而言,我使用m_,因为它比这个->短,感觉紧凑。
正如在许多其他响应中所述,m_是一个表示成员变量的前缀。它在c++世界中被广泛使用,并传播到其他语言中,包括Java。
在现代IDE中,这完全是多余的,因为语法高亮显示使得哪些变量是局部变量,哪些变量是成员变量变得很明显。然而,当语法高亮显示在90年代末出现时,这个约定已经存在了很多年,并且被牢固地设定了(至少在c++世界中是这样)。
我不知道你指的是哪个教程,但我猜他们使用惯例是由于以下两个因素之一:
它们是c++教程,由习惯m_约定的人编写,和/或… 他们用纯(等宽)文本编写代码,没有语法高亮显示,因此m_约定有助于使示例更清晰。