【发布时间】:2015-05-11 00:48:22
【问题描述】:
我使用全局变量没有任何明显问题,但想知道我使用全局变量是否存在潜在问题或缺点。
在第一个场景中,我将 const 全局变量包含到 globals.h 文件中,然后将标头包含到需要访问任何一个全局变量的各种实现文件中:
globals.h
const int MAX_URL_LEN = 100;
const int MAX_EMAIL_LEN = 50;
…
在第二种情况下,我在应用程序执行时在实现文件中声明并初始化全局变量。这些全局变量永远不会再被修改。当我需要从不同的实现文件访问这些全局变量时,我使用 extern 关键字:
main.cpp
char application_path[128];
char data_path[128];
// assign data to globals
strcpy(application_path, get_dll_path().c_str());
…
do_something.cpp
extern char application _path[]; // global is now accessible in do_something.cpp
关于上面的第一种情况,我考虑过删除所有不同的“include globals.h”,并在需要访问这些全局变量的地方使用 extern,但没有这样做,因为只包含 globals.h 非常方便。
我担心每个包含 globals.h 的实现文件会有不同版本的变量。
我应该使用 extern 而不是在需要访问的任何地方都包含 globals.h 吗?
请指教,谢谢。
【问题讨论】:
-
建议:常量很好,但不要使用全局变量。根据需要传递数据或对象。
-
你可能想看看这个关于全局变量的整体:stackoverflow.com/questions/484635/are-global-variables-bad
-
您可以将
extern something;放在标题中,然后包含该标题以手动编写外部变量。此外,您不得在全局命名空间中使用以_开头的名称(因为标准是这样规定的)。 -
我强烈建议创建提供对全局数据的访问权限的函数,例如
extern char const* get_application_path();,而不是提供对数据的直接访问权限。