全局变量,它们到底是什么? 首先,我是C++新手,尝试“前缀”变量。 但我不太清楚。 所以我的问题是,在静态变量前面加上“g_”前缀是否正确? 谢谢大家! using namespace std; // The main window class name. static TCHAR g_szWindowClass[] = _T("win32app"); // The string that appears in the application's title bar. static TCHAR g_szTitle[] = _T("Win32 App"); ...

全局变量,它们到底是什么? 首先,我是C++新手,尝试“前缀”变量。 但我不太清楚。 所以我的问题是,在静态变量前面加上“g_”前缀是否正确? 谢谢大家! using namespace std; // The main window class name. static TCHAR g_szWindowClass[] = _T("win32app"); // The string that appears in the application's title bar. static TCHAR g_szTitle[] = _T("Win32 App"); ...,c++,variables,global,C++,Variables,Global,C++11标准(草案n3337): 17.6.4.3.2全局名称[全局名称] 某些名称和函数签名集始终保留给实现: -包含双下划线或以下划线开头,后跟大写字母(2.12)的每个名称都保留给实现以供任何使用 -每个以下划线开头的名称都保留给实现,以用作全局命名空间中的名称 除此之外,您为全局变量选择的(标识符)名称没有任何限制 这是一些人使用的一种惯例,用g_作为全局变量的前缀,用m_作为成员变量的前缀,等等。这是一个选择的问题;语言本身并没有强加这样的要求。因此,只要标识符以英文字母开头,您就可

C++11标准(草案n3337):

17.6.4.3.2全局名称[全局名称]

某些名称和函数签名集始终保留给实现:

-包含双下划线或以下划线开头,后跟大写字母(2.12)的每个名称都保留给实现以供任何使用

-每个以下划线开头的名称都保留给实现,以用作全局命名空间中的名称

除此之外,您为全局变量选择的(标识符)名称没有任何限制

这是一些人使用的一种惯例,用
g_
作为全局变量的前缀,用
m_
作为成员变量的前缀,等等。这是一个选择的问题;语言本身并没有强加这样的要求。因此,只要标识符以英文字母开头,您就可以随意给它们命名,并在它们前面加上任何前缀


关于全局变量的使用,我会说,如果你刚开始学习C++,使用它们,受到伤害,然后意识到它们是多么的坏;您将了解为什么有经验的程序员总是谴责它们。仅仅告诉他们是坏的不会增加什么价值,有些事情最好通过经验来学习。

最好使用前缀来区分全局变量本身。但是

  • 最好尽可能避免全局变量,并且

  • <> > C++中,可以使用命名<强>命名空间<强> > < /p> 。
它还有许多优点可以避免微软的
T
宏愚蠢。它支持Windows9x,而你可能不是针对Windows9x。此外,它还有许多优点,尤其是在维护方面,可以避免微软愚蠢的匈牙利符号,也就是像
sz
这样的前缀,它支持微软1980年代的程序员工作台帮助系统,就像Windows 98一样,已经不再那么重要了

此外,在实际可行的情况下,使用
const
也是有利的

请注意,命名空间级别的
const
意味着静态存储类,因此不再需要显式的
static

因此,不是当前

// The main window class name.
static TCHAR g_szWindowClass[] = _T("win32app");

  • C++名称空间
    g
    而不是C前缀
    g

  • const
    已添加,保证此变量不被修改,以及

  • 直接使用宽字符文字而不是Microsoft Windows 9x
    T

然后您可以引用
g::windowClassName
,或者使用名称空间g在
之后不使用前缀
,或者甚至使用
g
的别名


我用于名称空间的特定大括号约定支持嵌套名称空间,而不需要缩进。不幸的是,普通编辑器不支持这一点。

C++没有正式的命名约定。它确实有一些关于变量名或标识符的规则,您必须遵循这些规则,但除此之外,名称完全由您决定,它带来了所有的灵活性和危险(与语言的其他部分非常相似)

以下是规则的良好概述:

例如,
\u G_szTitle
可能是错误的,但是
G_szTitle
是可以的

真正的问题是您几乎肯定不想使用globals。全局变量几乎总是糟糕的设计。避开它们


另一个较小的问题是使用所谓的“匈牙利符号”。谷歌有点了解为什么许多人(包括我自己)反对它,尤其是在像C++这样的语言中。

< P>最明显的全局变量定义是在命名空间范围(包括最外层命名空间)声明的变量。 现在,您可以认为在名称空间范围内声明的变量也是声明的
静态的
,因此在给定的转换单元之外是不可见的。同样,在未命名命名空间中声明的变量可能被视为非全局变量。然而,这两类变量都具有全局变量的许多不良特性。例如,当从多个线程访问时,它们会引入一个序列化点

因此,我实际上考虑了更广泛的变量是全局变量,即,在类和函数区域>代码>静态< /代码>变量中,也就是<代码>静态< /代码>数据成员。在一个程序中,每一个都只存在一次。仅仅因为这些构造恰好用于某些[反]设计模式(值得注意的单例),并不能神奇地保护全局变量


关于变量名称的前缀:不要在变量名称中包含类型前缀!在C++中,编译器已经充分检查了类型。包含类型可能最终导致名称不正确。特别是关于全局变量,我建议使用它们的前缀:无论何时,只要您想使用全局变量的前缀,请停止您正在做的任何事情!您正处于构造问题的过程中,您应该寻求更改设计,以消除对全局变量的需要

全局变量是不在类或函数内部的任何变量。至于它是否正确-当然,如果你想的话。这并不违法。这都是一个风格的问题,没有正确的答案。我不给变量加前缀。就命名惯例而言,恐怕没有“正确”这样的东西。伊姆霍,你的建议不是不合理的。尽管如此,我相信有些人会不同意。在任何情况下,最重要的是你要始终如一地遵循任何惯例
namespace g {
    auto const windowClassName = L"win32app";
}