在使用基于控制台的程序时,我倾向于使用getopt()
或getopt_long
解析命令行参数。然而,大多数时候我最终使用全局变量来存储我可以在所有*.c
文件中使用的配置参数。
所以我很想知道你使用什么模式,以及什么是全局变量的更好替代方案。
在使用基于控制台的程序时,我倾向于使用getopt()
或getopt_long
解析命令行参数。然而,大多数时候我最终使用全局变量来存储我可以在所有*.c
文件中使用的配置参数。
所以我很想知道你使用什么模式,以及什么是全局变量的更好替代方案。
我一般定义一个结构:
struct ConfigurationOpts {
int interval;
int fullscreen;
/* ... */
};
并将指向其他模块实例的指针传递struct ConfigurationOpts
给其他模块:
int main() {
struct ConfigurationOpts conf;
/* ... */
init_submodule1(&conf);
init_submodule2(&conf);
return 0;
}
封装
将您全局使用的所有变量放在一个结构中。
保持范围最小如果只有您从 main 调用的函数需要命令行参数,则使用命令行选项传递结构 如果从多个位置调用它,则
hh :声明+定义具有命令行选项的全局变量 main.c :初始化变量 user1.c :通过 hh 引用变量 user2.c :通过 hh 引用变量
(在这种情况下可能并不真正适用。)使用完后,只需使用选项取消初始化结构。它可能真的在你的程序路径的中间,也可能在最后。有一个变量来判断结构是否已初始化,而不是依赖于函数调用的顺序。(你不相信实习生!:))
我使用单个记录来保存所有系统范围的数据,即单例模式。访问是通过一个函数将静态指针(或宏)的值返回给单例记录。这种方法允许用于扩展、持久性、旧版本兼容性等的各种选项。在经历了将系统范围的数据随意放置在分散的全局变量中的程序的痛苦经历后,我采用了它。