避免使用全局变量读取C中的配置文件



我的项目是在linux平台下用C语言开发的。我也使用libxml2。可执行文件由分布在多个c文件中的多个模块组成。

我有一个包含20个可配置参数的配置文件(Xml)。

假设我正在读取模块M1中的配置文件参数。但我需要它们在其他大模块M2和M3。

是否有有效的方法使所有模块都可以使用可配置参数,而不使用全局变量读取模块M1中的参数?

是否有其他的方法或设计来避免使用全局声明的变量来读取配置参数?

首先,如果值被读取一次并且之后从未更改,那么将它们存储为全局变量并不是什么大罪。

处理这个问题的最佳(通用)方法是读取XML,将值转换为它们的原生类型(作为XML字符串的数字转换为整数),并将它们一起存储在一个结构体中。该结构只有一个实例化,但不要强调它是"单例"。一个结构可以被全局访问,或者一个指向它的指针可以传递给不同的模块。

在这种情况下,我确实会使用全局变量,您的变量确实似乎被所有模块全局使用。但是,为了减轻全局命名空间污染,您需要将这些变量放入结构体中。

创建一个名为ConfigGlobals或其他描述性名称的结构体,并简单地为每个配置选项添加成员。这增加了清晰度,因为您一眼就知道哪些变量是配置的,并且意味着您只需将一个名称放入全局作用域。

编辑:注意我看到这个答案与James Curran的答案相似,我很抱歉,复制完全是巧合,我不是故意复制你,我在你发布之前就开始写这个了。

解决问题的更好方法是:1-将所有配置变量放在一个结构中2-创建该结构的STATIC变量(因此作用域仅在该文件中)3-使用getter和setter读取和写入参数

通过这种方式,如果明天你的应用程序是多线程的,那么你可以在Setter和getter中使用互斥锁来保护你的参数。通过这种方式,它将是一个更干净的方法来访问…

有时使用global变量并不是那么混乱,但为了改进封装并避免一些其他问题,您可能需要考虑使用struct来代替。

通过这种方式,您只需声明一次configStruct,然后将它从一个函数传递到另一个将使用它的函数。

这将更加麻烦,必须来回传递结构体,特别是对于可能需要它的深层嵌套函数,但是您可以控制数据并避免全局问题。

另一个优点是能够在运行时使用和选择多个配置。

可以这样写:

typedef struct configs
{
    int config1;
    // other configuration variables....
} configs;
int main(void)
{
    configs myConfigs;
    loadConfigs(&myConfigs);
    operateRobot(&myConfigs);
    // rest of the program
    return 0;
 }

您的一个模块如何使用另一个这样的模块的功能?可能你有少量的函数是使用外部语句导出的?

有一个专门管理配置的模块,并让它导出一些合适的访问器函数。

最新更新