我经常看到m_
用于变量 ( 前缀 m_World
, m_Sprites
,...)的教程,范例和其他代码主要涉及到游戏的开发。
为什么人们添加前缀m_
变量?
我经常看到m_
用于变量 ( 前缀 m_World
, m_Sprites
,...)的教程,范例和其他代码主要涉及到游戏的开发。
为什么人们添加前缀m_
变量?
这是用于定义为成员变量变量典型的编程实践。 因此,当你在以后使用它们,你不需要看到他们定义知道它们的范围。 这也是伟大的,如果你已经知道的范围和你使用类似智能感知 ,你可以开始m_
和所有成员变量的列表中显示。 匈牙利表示法的一部分,看到有关范围的一部分这方面的例子 。
在清洁代码:敏捷软件工艺的手册没有针对这个前缀的使用明确的建议:
你也不需要前缀的成员变量
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;
}
}
我们用语言结构计数指成员变量中明确不确定性的情况下( 即 , description
成员和description
参数): this
。
这是在C ++中常见的做法。 这是因为在C ++中,不能为成员函数和成员变量具有相同的名称,和getter功能通常没有“得到”前缀命名。
class Person
{
public:
std::string name() const;
private:
std::string name; // This would lead to a compilation error.
std::string m_name; // OK.
};
main.cpp:9:19: error: duplicate member 'name' std::string name; ^ main.cpp:6:19: note: previous declaration is here std::string name() const; ^ 1 error generated.
http://coliru.stacked-crooked.com/a/f38e7dbb047687ad
对于“成员”,“M_”的状态。 前缀“_”也很常见。
你不应该在通过使用不同的约定/语法解决这个问题的编程语言使用它。
该m_
前缀通常用于成员变量-我认为它的主要优点是,它有助于一个公共财产和私有成员变量后盾它之间建立一个明显的区别:
int m_something
public int Something => this.m_something;
它可以帮助有后盾变量一致的命名约定,以及m_
前缀是这样做的一个办法-一个不区分大小写的语言的作品。
这是多么有用是依赖于语言和您使用的工具。 具有较强的重构工具和智能现代的IDE有这样的约定不太需要,而且它肯定不是这样做的唯一途径,但它是值得意识到在任何情况下的做法。
正如在其他的答案所述, m_
前缀用于表示变量是一个类的成员。 这是匈牙利表示法不同,因为它并不表示该变量,但它的上下文的类型。
我用m_
在C ++而不是在其他一些语言,其中“这个”或“自我”是必须的。 我不喜欢看“这个 - >”使用C ++,因为它杂波的代码。
另一个回答说m_dsc
是“不好的做法”和“描述;” 是“好的做法”,但是这是一个红色的鲱鱼,因为这个问题是存在的缩写。
另一个回答说打字this
弹出的智能感知,但任何好的IDE将有一个热键弹出智能感知当前类的成员。
正如在许多其他答复说,M_是指成员变量的前缀。 这是/是常用的C ++世界上使用并传播到其他语言也一样,包括Java。
在现代IDE是完全多余的,因为语法高亮就能看出这是局部变量,哪些成员 。 然而,时间语法高亮出现在90年代末,该公约已经很多年了,并坚定地(在C ++中至少)。
我不知道哪个教程你是指,但我会猜想,他们正在使用的。这是因为两个因素:
为了完成当前的答案,因为这个问题是不特定的语言,一些C-项目中使用前缀m_
定义特定于某个文件的全局变量-和g_
全局变量已经作用域比他们定义的文件较大。
在前缀定义这种情况下的全局变量m_
应该被定义为static
。
见EDK2(UEFI一个开源实现)编码约定使用这种约定项目的例子。
我还没有看到有一种说法是,一个前缀,如m_
可以用来防止名称与冲突#define
倒是宏的。
对于正则表达式搜索#define [az][A-Za-z0-9_]*[^(]
在/usr/include/term.h
从诅咒/ ncurses的。