在编译时初始化数据结构

时间:2014-04-21 21:34:13

标签: c++ c++03

我正在为我正在编写的嵌入式应用程序创建一些初始化数据结构,但仍处于设计阶段,想知道如何初始化各种数据结构。

在下面的示例中,数组的大小永远不会改变,但内容将在运行时期间发生。

其中一个数据结构如下:

int id;
int type;
unsigned char data[x]

所以例如(用C表示法)

{4,1,{1,2,3,4,5,6,7,8}}
{2,0,{4,2,1}}
{3,2,{9,1,2,9,2}}
etc.. (about 20 other lines)

在运行应用程序期间,上述数组的长度永远不会改变,但内容将会改变。

所以我想到了一个模板化的课程:

template<int N>
  class ds
  {
     public: // aggregate class for easy initialisation
     int id;
     int type;
     unsigned char elements[N];
     static int size() { return N; }
  };

那么你可以这样做:

ds<8> v1 = {4,1,{1,2,3,4,5,6,7,8}}

问题:如果没有这些方法被模板化,这也很容易传递给方法,并且会产生太多代码膨胀 - 为每个唯一大小创建方法的副本。我可以通过将它转换为类似的结构并使用&#34; int元素[1]&#34;来解决这个问题。得到数据,但后来我不知道大小,这似乎也是一种讨厌的方式。

我宁愿没有像&#34; doSomething(v1.id,v1.type,v1.elements,v1.size)这样的函数调用;

所以我已经退回到旧的做事方式,这似乎有用:

struct foo
{
   int id;
   int type;
   unsigned char *data;
   int size;
};

unsigned char data[] = {1,2,3,4,5,6,7,8};
foo bar = {4,1,data,sizeof(data)/sizeof(data[0])};

哪个有效,我可以绕过&foo foo&#39;结构到我选择的任何方法。

但它有一种更友好的C ++方式吗? 也许是一种无需拥有数据的方法。和&#39; bar&#39;作为两个独立的变量?

3 个答案:

答案 0 :(得分:0)

某些编译器接受字段名称说明符初始化:

foo bar =
{
  .id = 4,
  .type = 1,
  .data = {1,2,3,4,5,6,7,8},
  .size = sizeof(data) / sizeof(data[0]),
};

不幸的是,Visual Studio 2010仍然不允许这种语法。

如果数据是常量,您可能希望将变量作为static const加前缀。这将允许链接器/编译器将数据放入只读部分。

答案 1 :(得分:0)

如果您的编译器支持C ++ 11,则可以在类成员初始化中使用。请参阅以下代码:

#include <iostream>

struct foo
{ 
  int size = 3;
  int id   = 1;
  int type = 2;
  unsigned char data[3] = {'1', '2', '3'};
};

int main()
{
  foo a;
  std::cout << "a.id    = " << a.id      << std::endl;
  std::cout << "a.size  = " << a.size    << std::endl;
  std::cout << "a.type  = " << a.type    << std::endl;
  std::cout << "data[0] = " << a.data[0] << std::endl;
  std::cout << "data[1] = " << a.data[1] << std::endl;
  std::cout << "data[2] = " << a.data[2] << std::endl;

  return 0;
}

但是请注意,初始化不是在编译期间完成的,而是在声明变量a并且引发其构造函数的运行时。

我无法看到如何在编译期间初始化成员变量(即一块内存),因为它不是静态的(即,在编译时无法初始化常规成员变量)。

答案 2 :(得分:0)

是否有声明表明您需要创建固定大小的数据结构?我知道你说大小永远不会改变所以为什么不使用vector<unsigned char>?或者你可以将C与C ++混合,并为结构创建一个构造函数,用于分配数组并复制项目,例如:

struct foo
{
   foo(int size, char* in_data) {
       data = new char[size];
       memcpy(data, in_data, size * sizeof(char));
   }
   int id;
   int type;
   unsigned char *data;
   int size;
};