12

许多 其他 问题涉及如何通过在头文件中声明变量并在 .cpp 文件中定义(分配)变量来分配变量。

我想要做的是不为我的类使用任何 .cpp 文件,并将所有函数定义为内联(在头文件中)。我遇到的问题是如何定义静态成员变量,这样即使 .h 文件包含在多个编译单元中,我也不会收到“第一次在这里定义”链接器错误。

如果可以完成工作,我愿意接受预处理器黑客等。我只想避免任何 .cpp 文件。

如果重要的话,我正在使用 GCC。

4

3 回答 3

14

如果您确实必须避免使用任何 .cpp 文件,则可以滥用单例模式:

class Foo {
    public:
        static Bar& getMyStatic() {
            static Bar bar;
            return bar;
        };
};

这是有效的,因为现在变量是函数内部的静态变量,并且static在函数上下文中的含义与在类上下文中的含义不同。对于函数,链接器确实可以识别多个相同的定义并丢弃副本。

但是,当然,我强烈建议不要避免使用 .cpp 文件:这意味着您必须将整个程序或至少大部分程序构建在一个大块中。您所做的每一项更改都需要完全重建,这会显着减慢您的更改-编译-测试周期。对于可能不是问题的非常小的项目,但它适用于大中型项目。

于 2013-08-03T11:34:49.117 回答
0

对于静态变量,您必须将其放入 .cpp 文件中,以避免在打算只拥有一个静态变量时出现多个静态变量的可能性。此外,拥有大的内联方法不是一个好主意,因为它只是对编译器的提示,但也会使编译花费更长的时间(您在开发中更改了其中一些函数,然后需要编译大量依赖文件!)

但是,如果您不想要大量 .cpp 文件,其中只有一些静态数据,为什么不只使用一个文件来存储它们。

于 2013-08-03T10:35:11.843 回答
-1

只要您在整个项目中只包含该头文件一次,就可以了。但是,这是一个非常严格的要求,很难让其他人遵守。

你可以有一个static变量,但这意味着你有一个以上的整个程序,这可能或可能不重要(请记住,你将来不能改变它,所以你可能有所谓的“潜在bug”——你改变了一些其他的代码,突然之间你创建了一个新的 bug,因为变量不是一个变量)。

于 2013-08-03T10:34:49.967 回答