代码之家  ›  专栏  ›  技术社区  ›  Rob

在头中声明并初始化静态int

c++
  •  2
  • Rob  · 技术社区  · 14 年前

    如果在头文件中包含以下内容:

    福奥

    Foo
    {
    public:
      static const int BAR = 1234;
      ...
    };
    

    我是否还需要在.cpp中定义变量,例如:

    英尺·CPP

    const int Foo::BAR;
    

    我们有一个问题,在头文件中初始化一个静态文件似乎可以在MS编译器上工作,但是在Mac上使用GCC,似乎会给链接器带来错误。

    4 回复  |  直到 14 年前
        1
  •  5
  •   Mike Seymour    14 年前

    你需要声明和定义,就像你写的那样。

    因为它是一个整数,所以可以像您所做的那样在声明中对其进行初始化,并且编译器应该尽可能将其视为编译时常量。但它仍然需要在源文件中定义一个(并且只有一个)定义,否则当不能将其视为常量时,您将得到链接错误。

    显然,微软认为标准行为过于混乱,并且“扩展”了语言,以将带有初始化器的声明作为定义;请参见 this issue . 结果是,如果您也正确地定义了符号,您将得到链接错误(多重定义的符号)。您可以通过禁用语言扩展来获得标准行为( /Za )

        2
  •  1
  •   Peter G.    14 年前

    第一个片段适用于某些环境,但某些编译器确实需要定义,当然,如果您使用常量的地址。

    如果您不想通过触摸头部和主体来引入常量,那么仍然有一个古老的枚举技巧:

    class A
    {
       public:
           enum { someconstant=1234 };
    };
    

    使某个常量可用作编译时常量,而不需要在主体中定义。

        3
  •  0
  •   karlphillip    14 年前

    声明应该在头中完成,初始化应该在.cpp上完成。

    有一篇关于静态成员变量的有趣文章 here .

        4
  •  0
  •   C.J.    14 年前

    头文件

    Foo
    {
    public:
      static const int BAR;
      ...
    };
    

    代码文件

    const int Foo::BAR = 1234;