我经常在教程、示例和其他与游戏开发相关的代码中看到m_前缀用于变量(m_World、m_Sprites等)。

为什么人们在变量前加前缀m_ ?


当前回答

为了完成当前的答案,因为这个问题不是特定于语言的,一些c项目使用前缀m_来定义特定于文件的全局变量,使用g_来定义作用域大于所定义文件的全局变量。 在这种情况下,使用前缀m_定义的全局变量应该定义为静态变量。

请参阅EDK2 (UEFI开源实现)编码约定,了解使用该约定的项目示例。

其他回答

为了完成当前的答案,因为这个问题不是特定于语言的,一些c项目使用前缀m_来定义特定于文件的全局变量,使用g_来定义作用域大于所定义文件的全局变量。 在这种情况下,使用前缀m_定义的全局变量应该定义为静态变量。

请参阅EDK2 (UEFI开源实现)编码约定,了解使用该约定的项目示例。

正如在许多其他响应中所述,m_是一个表示成员变量的前缀。它在c++世界中被广泛使用,并传播到其他语言中,包括Java。

在现代IDE中,这完全是多余的,因为语法高亮显示使得哪些变量是局部变量,哪些变量是成员变量变得很明显。然而,当语法高亮显示在90年代末出现时,这个约定已经存在了很多年,并且被牢固地设定了(至少在c++世界中是这样)。

我不知道你指的是哪个教程,但我猜他们使用惯例是由于以下两个因素之一:

它们是c++教程,由习惯m_约定的人编写,和/或… 他们用纯(等宽)文本编写代码,没有语法高亮显示,因此m_约定有助于使示例更清晰。

正如在其他答案中所述,m_ prefix用于表示变量是类成员。这与匈牙利符号不同,因为它没有指出变量的类型,而是它的上下文。

我在c++中使用m_,但在其他一些必须使用“this”或“self”的语言中不使用。我不喜欢看到'this->'与c++一起使用,因为它会使代码混乱。

另一个答案说m_dsc是“坏做法”和“description;”是“好做法”,但这是一个转移注意力的问题,因为这里的问题是缩写。

另一个答案是,输入这个会弹出智能提示,但任何好的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*
}

为了它的价值而接受它。

这在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_”表示成员。前缀“_”也很常见。

你不应该在通过使用不同的约定/语法来解决这个问题的编程语言中使用它。