在C ++头文件中声明和定义静态变量?

时间:2013-08-03 10:28:31

标签: c++ variables gcc static

Many other questions通过在头文件中声明并在.cpp文件中定义(分配)来处理如何分配变量。

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

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

如果重要我正在使用GCC。

3 个答案:

答案 0 :(得分:14)

如果你真的必须避免任何.cpp文件,你可以滥用单例模式:

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

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

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

答案 1 :(得分:0)

对于静态变量,您必须放入.cpp文件,以避免在意图只有一个静态变量的情况下出现多个静态变量。除了使用大型内联方法不是一个好主意,因为它只是对编译器的一个提示,但也使编译需要更长的时间(你在开发中更改了一些这些函数,然后需要编译很多相关文件!)< / p>

但是如果你不想要很多只有几个静态的.cpp文件,为什么不用一个文件来存储它们呢。

答案 2 :(得分:-1)

只要您在整个项目中只包含该头文件一次,就可以了。然而,这是一个非常强烈的要求,并且很难让其他人坚持。

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