倘若向一位资深程序员请教一条关于良好编程实践的建议,对方十有八九会回答:“避免使用全局变量!"——理由充分:全局变量是该语言历史上最常被滥用的概念之一。尽管在小型示例程序里它们看似无害,但在大型代码库中却常常带来严重问题。
新手往往偏爱大量全局变量,因为它们易于使用,尤其在需要多次调用不同函数时(通过形参传递数据确实繁琐)。然而,这通常是一个糟糕的决定。许多开发者主张彻底避免非常量全局变量。
在深入原因之前,必须先澄清:当开发者说"全局变量是邪恶的"时,他们通常指的并非所有全局变量,而是非常量全局变量。
一、为何非常量全局变量危险
最根本的原因是:其值可被任何被调函数修改,而程序员难以预知这一变化。示例:
#include <iostream>
int g_mode; // 声明全局变量(默认零初始化)
void doSomething()
{
g_mode = 2; // 将全局 g_mode 设为 2
}
int main()
{
g_mode = 1; // 注意:这是对全局 g_mode 赋值,而非声明局部变量!
doSomething();
// 程序员仍期望 g_mode 为 1
// 但 doSomething 已将其改为 2!
if (g_mode == 1)
std::cout << "No threat detected.\n";
else
std::cout << "Launching nuclear missiles...\n";
return 0;
}