在头文件中初始化常量静态数组

时间:2010-01-22 13:01:05

标签: c++ arrays initialization header-files

我刚刚发现以下内容无效。

//Header File
class test
{
    const static char array[] = { '1', '2', '3' };
};

初始化这个的最佳位置在哪里?

6 个答案:

答案 0 :(得分:49)

最佳位置是源文件

// Header file
class test
{
    const static char array[];
};

// Source file
const char test::array[] = {'1','2','3'};

您可以像尝试的那样在类声明中初始化整数类型;所有其他类型必须在类声明之外初始化,并且只能初始化一次。

答案 1 :(得分:29)

您可以随时执行以下操作:

class test {
  static const char array(int index) {
    static const char a[] = {'1','2','3'};
    return a[index];
  } 
};

关于这个范例的一些好消息:

答案 2 :(得分:20)

//Header File 
class test 
{ 
    const static char array[];
}; 

// .cpp
const char test::array[] = { '1', '2', '3' }; 

答案 3 :(得分:6)

现在,在C ++ 17中,您可以使用内联变量

How do inline variables work?

  

一个简单的静态数据成员(N4424):

struct WithStaticDataMember {
  // This is a definition, no out­of­line definition is required.
  static inline constexpr const char *kFoo = "foo bar";
};

在你的例子中:

//Header File
class test
{
    inline constexpr static char array[] = { '1', '2', '3' };
};

应该正常工作

答案 4 :(得分:0)

这是对系统的一种滥用,但是如果您确实要在头文件中定义它(并且您没有C ++ 17),则可以这样做。它不会是一个静态成员,但是它将是一个仅占用每个编译单元(而不是每个类实例)存储的常量:

(将所有这些代码放在头文件中。)

namespace {
    const char test_init_array[] = {'1', '2', '3'};
}

class test {
public:
    const char * const array;

    test() : array(test_init_array) {}
};

答案 5 :(得分:0)

使用constexpr,即使在C ++ 11中,也必须在标头上定义值

如果您使用constexpr而不是const,那么this answer suggests不仅可以而且必须在标头even in C++11上进行定义:

#include <cassert>

struct MyClass {
    static constexpr int is[] = {1, 2, 3};
    static constexpr int i = 1;
};

// TODO is this ever mandatory? Create example that fails on -std=c++11.
// Pretty sure never mandatory in C++17 https://stackoverflow.com/a/40959093/895245
// constexpr int MyClass::is[];

int main (void) {
    assert(MyClass::is[0] == 1);
    assert(&MyClass::is[0] == &MyClass::is[1] - 1);
    assert(MyClass::i == 1);
    assert(&MyClass::i == &MyClass::i);
}

编译并运行:

g++-10 -ggdb3 -O0 -std=c++11 -Wall -Wextra -pedantic -o main.out main.cpp
./main.out 

如果相反,您尝试:

struct MyClass {
    static constexpr int is[];
};

constexpr int MyClass::is[] = {1, 2, 3};

编译失败:

main.cpp:4:26: error: ‘constexpr’ static data member ‘is’ must have an initializer

在Ubuntu 20.04上测试。