【问题标题】:Declare and define static variable in C++ header?在 C++ 头文件中声明和定义静态变量?
【发布时间】:2013-08-04 14:33:27
【问题描述】:

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

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

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

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

【问题讨论】:

  • 您只需将变量声明为static。将在包含头文件的每个翻译单元中创建变量的新实例,但在链接时,不会有冲突,因为对象具有静态链接...
  • 不,静态数据成员有外部链接。
  • “定义它(分配)”:定义分配是两个不同的东西。
  • @cmaster - 分配是定义的部分,但它们不是一回事。
  • @PeteBecker 确实这些词具有不同的含义,但是对于变量,它们本质上是同义词,因此“定义它(分配)”没有任何问题。但是这个讨论没有任何结果,所以我建议我们都删除我们的 cmets。

标签: c++ variables gcc static


【解决方案1】:

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

您可以有一个static 变量,但这意味着您有多个用于整个程序的变量,这可能会或可能无关紧要(请记住,您将来无法更改它,因此您可能有所谓的“潜在错误” - 您更改了一些其他代码,突然之间您创建了一个新错误,因为该变量不是一个变量)。

【讨论】:

  • 麻烦的是,它可能一开始并不重要,但在未来它可能会这样做,并且你无意中引入了一个错误
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

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

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

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

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

    【讨论】:

    • 这似乎是避免将静态变量放入 .cpp 文件的最佳(也是唯一)方法。至于编译时间:我的编译代码被限制在 32KB,所以它设置了一个上限。
    猜你喜欢
    • 1970-01-01
    • 2016-12-19
    • 2010-09-10
    • 1970-01-01
    • 1970-01-01
    • 2011-08-24
    • 2014-07-24
    • 1970-01-01
    相关资源
    最近更新 更多