我经常在教程、示例和其他与游戏开发相关的代码中看到m_前缀用于变量(m_World、m_Sprites等)。
为什么人们在变量前加前缀m_ ?
我经常在教程、示例和其他与游戏开发相关的代码中看到m_前缀用于变量(m_World、m_Sprites等)。
为什么人们在变量前加前缀m_ ?
当前回答
m_前缀通常用于成员变量——我认为它的主要优点是有助于明确区分公共属性和支持它的私有成员变量:
int m_something
public int Something => this.m_something;
对于备份变量有一个一致的命名约定是有帮助的,m_前缀是一种实现方式——在不区分大小写的语言中是有效的。
这有多有用取决于你所使用的语言和工具。具有强大的重构工具和智能感知功能的现代ide不太需要这样的约定,而且这当然不是做到这一点的唯一方法,但在任何情况下都值得注意这种实践。
其他回答
这在c++中是很常见的做法。这是因为在c++中,成员函数和成员变量的名称不能相同,而getter函数的名称通常没有“get”前缀。
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:错误:重复成员名称 std:: string名称; ^ Main.cpp:6:19:注意:之前的声明在这里 Std::字符串名称() ^ 产生1个错误。 http://coliru.stacked-crooked.com/a/f38e7dbb047687ad
“m_”表示成员。前缀“_”也很常见。
你不应该在通过使用不同的约定/语法来解决这个问题的编程语言中使用它。
为了完成当前的答案,因为这个问题不是特定于语言的,一些c项目使用前缀m_来定义特定于文件的全局变量,使用g_来定义作用域大于所定义文件的全局变量。 在这种情况下,使用前缀m_定义的全局变量应该定义为静态变量。
请参阅EDK2 (UEFI开源实现)编码约定,了解使用该约定的项目示例。
m_前缀通常用于成员变量——我认为它的主要优点是有助于明确区分公共属性和支持它的私有成员变量:
int m_something
public int Something => this.m_something;
对于备份变量有一个一致的命名约定是有帮助的,m_前缀是一种实现方式——在不区分大小写的语言中是有效的。
这有多有用取决于你所使用的语言和工具。具有强大的重构工具和智能感知功能的现代ide不太需要这样的约定,而且这当然不是做到这一点的唯一方法,但在任何情况下都值得注意这种实践。
洛克希德·马丁公司使用了一个3前缀命名方案,这是非常棒的工作,特别是在阅读别人的代码时。
Scope Reference Type(*Case-by-Case) Type
member m pointer p integer n
argument a reference r short n
local l float f
double f
boolean b
所以…
int A::methodCall(float af_Argument1, int* apn_Arg2)
{
lpn_Temp = apn_Arg2;
mpf_Oops = lpn_Temp; // Here I can see I made a mistake, I should not assign an int* to a float*
}
为了它的价值而接受它。
还有人提到它的意思是一个阶级成员。Qt是一个流行的c++框架,它使用了这个符号,所以很多c++ GUI教程都使用m_。你可以看到他们几乎所有的例子都使用m_作为类成员。就我个人而言,我使用m_,因为它比这个->短,感觉紧凑。