【问题标题】:C++: Static keyword in non-class context? [duplicate]C++:非类上下文中的静态关键字? [复制]
【发布时间】:2014-12-24 09:30:33
【问题描述】:

下面的静态是否有意义(我来自 Java 背景)?它可以编译,但约定/标准是什么?

#ifndef FUNC_H
#define FUNC_H

int func(const int& x, const int& y);

//cache frequently used values
const static int a = func(2, 0);
const static int b = func(3, 0);

#endif // FUNC_H

【问题讨论】:

  • 假设这是一个头文件,每个 static 变量的唯一副本将在包含此头文件的每个源文件中实例化。假设func 为相同的输入返回相同的输出,所有这些实例在不同的源文件中都是相同的。而且由于这些变量是只读的,因此实例化它们的不同副本并初始化为相同值是没有意义的。底线 - static 是多余的。
  • 另一方面,如果你在多个源文件中包含这个头文件,那么你会得到没有static的链接错误。我会声明它们extern 而不是static,并在其中一个源文件而不是头文件中初始化它们(通过调用func)。
  • 顺便说一句:看到内置类型不必要地传递为 const& 而不是按值传递确实很少见。
  • @Deduplicator 所以通过引用而不是值传递内置类型没有性能提升?
  • 很少有内置类型比桌面系统上的指针大(嵌入式平台上更多)。对于那些,有时,不复制它们可能会有好处。虽然这种情况很少见,但由于间接、混叠等方面的成本。

标签: c++ static


【解决方案1】:

假设它是一个标题,这个“const static”常量看起来不太好......它所做的是在 EACH中创建“本地”(文件范围 - 仅在文件中可见)常量> 包含您的标头的源文件。因此,如果您在 10 个源文件中包含此标头,您将获得此常量的 10 个副本,对 func() 的 10 次调用等。所有这些都可能具有相同的值(这取决于 func())。

从技术上讲,这是正确的,但它看起来并不好。

【讨论】:

    【解决方案2】:

    在这种情况下,static 关键字表示文件范围,就像在 C 中一样。
    可能不是您想要的公共标头。

    你想要的可能是extern,在你的头文件中:

    extern const int a;
    extern const int a;
    

    它将声明两个全局变量。
    然后你需要一个定义,在一些 .cpp 文件中:

    const int a = 42;
    const int b = 43;
    

    关于文件范围,这意味着这种声明的可见性将仅限于声明它的文件。链接器不会为此生成公共符号。
    因此,如果您在头文件中使用它,则会在包含头文件的每个文件中发出不同的声明。

    【讨论】:

      猜你喜欢
      • 2012-11-02
      • 1970-01-01
      • 1970-01-01
      • 2016-03-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多