c ++全局常量问题

时间:2009-10-05 01:18:01

标签: c++ constants

我们在一系列文件中定义了这些“实用程序”常量。问题来自TOO MANY文件包含这些全局常量文件的事实,如果我们向其中一个文件添加一个常量并尝试构建,它会构建整个库,这需要一个多小时。

有人能为这种方法提出更好的方法吗?非常感谢。

4 个答案:

答案 0 :(得分:7)

首先,如果你直接在标题中定义它们,我建议改为将它们显示为extern const,然后在cpp文件中定义它们:

//in .hpp:
extern const std::string foo;

//in .cpp:
const std::string foo = "FOO";

这样,至少可以在不重建的情况下更改定义。

其次,检查它们被包括在哪里。如果常量文件包含在低级标题中,是否可以将include移动到cpp?删除它可能会降低耦合,因此不必重建。

第三,分解该文件。我建议映射出你最终想要的结构,开始向新结构添加新常量而不是旧文件。最终(当你确定你有你想要的结构时),将旧文件重构为新结构,并使旧文件包含整个结构。最后,遍历并删除旧文件的所有包含,将它们指向适当的新部分。这将打破重构,因此您不必一次完成所有操作。

第四,如果头文件发生变化,您可能会欺骗编译器不重建。您必须检查编译器的文档,它可能不安全,因此您偶尔也想添加完整版本。

答案 1 :(得分:2)

您真的需要将每个全局定义都包含在每个文件中吗?您应该将常量拆分为类别,然后将它们拆分为不同的文件。

包含的每个.h只是简单地复制到包含它的文件中的那一点。如果您更改文件中的某些内容(直接或通过更改包含的内容),则绝对需要重新编译。

另一种解决方案是拥有一个.h文件,该文件具有对字符串名称/值的映射的访问权限。然后在该映射/访问器的.cpp文件中,您可以插入新值。您放置的每个新值只需要重新编译一个文件。

另一种解决方案是不在任何地方包含头文件。只需在每个.cpp文件中提供所需的变量。

答案 2 :(得分:1)

也许是时候进行一些重构来改进cohesion并减少软件设计中的coupling。拆分全局常量文件将允许模块更加选择性地包含哪些常量,这将消除一些常量 不必要的耦合在极端情况下,您可以将其一直分解为每个文件一个常量,并确保每个模块仅包含它需要使用的常量。

但是这可能导致内聚力差,因为常量可能会自然地落入相关群体中,因此需要一个常量的模块通常也会 需要该组中的许多其他人。因此,诀窍是在各种全局文件中找到更好的常量分组,然后确保每个模块仅包含它所需的内容。

答案 3 :(得分:0)

(编辑:我没有考虑外部常数。确实,我的想法有点愚蠢。)

(编辑:我的“愚蠢”宏观想法实际上节省了添加常量时的构建时间。感谢你指出这一点,Brian!)

使用并行建筑: - )

说真的,我认为一个解决方案是创建另一个名为utility_ex.hpp的头,或者你添加偶尔合并到utility.hpp中的新常量(或者调用当前实用程序常量头的任何内容)。

另一种(效率较低)解决方案是拥有这样的宏:

#define constant(name) get_constant(#name)
    // # means turn name into a string literal

int get_constant(const char *name);

现在假设您希望将MAX_CUSTOMERS定义为100.您可以说:

constant(MAX_CUSTOMERS)
代码中的

。在get_constant的代码中,您可能有:

int get_constant(const char *name) {
    if (!strcmp(name, "MAX_CUSTOMERS"))
        return 100;

    //shouldn't happen
    return -1;
}