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

时间:2014-07-28 14:45:19

标签: c variables global configuration-files

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

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

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

是否有任何有效的方法可以使所有模块都可以使用可配置参数,而无需使用全局变量来读取模块M1中的参数。

特别是有任何其他方法/设计可以避免使用全局声明的变量来读取配置参数。

5 个答案:

答案 0 :(得分:2)

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

处理此问题的最佳(通用)方法是读取XML,将值转换为其本机类型(数字作为xml字符串转换为整数),并共同存储在结构中。只有一个结构的实例,但不要强调使它成为“单身”。一个结构可以全局访问,或者指向它的指针可以传递给不同的模块。

答案 1 :(得分:2)

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

创建一个名为ConfigGl​​obals的结构或一些其他描述性名称,只需为每个配置选项添加成员。这增加了清晰度,因为您知道哪些变量一目了然,并且意味着您只将一个名称放入全局范围。

编辑:注意我看到这个答案类似于James Curran的答案,对不起,复制完全是巧合而且我并没有故意复制你,我在你发布之前就开始写这个了。

答案 2 :(得分:1)

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

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

答案 3 :(得分:1)

有时使用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;
 }

答案 4 :(得分:0)

您的某个模块如何使用其他此类模块的功能?可能你有少量使用extern语句导出的函数?

有一个专用于管理配置的模块,并导出一些合适的访问器功能。