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

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


当前回答

这是定义成员变量的典型编程实践。因此,当您以后使用它们时,不需要看到它们的定义位置就可以知道它们的作用域。如果你已经知道作用域,并且你正在使用智能感知之类的东西,这也很好,你可以从m_开始,然后显示所有成员变量的列表。匈牙利符号的一部分,请看这里例子中关于范围的部分。

其他回答

我还没有看到的一个参数是,像m_这样的前缀可以用来防止与#define'd宏的名称冲突。

在/usr/include/term.h查找curses/ncurses中的#define [a-z][A-Za-z0-9_]*[^(]

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

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

这是定义成员变量的典型编程实践。因此,当您以后使用它们时,不需要看到它们的定义位置就可以知道它们的作用域。如果你已经知道作用域,并且你正在使用智能感知之类的东西,这也很好,你可以从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;
    }
}

在显式歧义(即,描述成员和描述形参)的情况下,我们使用语言构造来引用成员变量:this。

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

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

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

另一个答案是,输入这个会弹出智能提示,但任何好的IDE都会有一个热键来弹出当前类成员的智能提示。