如何在C / C ++代码中使用C#struct array初始化?

时间:2012-03-28 23:01:16

标签: c# c++ c struct

说,我在C#中有以下结构:

public struct MyStructCSharp
{
    private byte[] offsets = new byte[] { 28, 20, 27, 36 };
}

你如何在C/C++中做同样的事情?

以下似乎不起作用:

typedef struct _MyStructCpp
{
    _MyStructCpp()
    {
        offsets[] = {28, 20, 27, 36};
    }

private:
    unsigned char offsets[];
}MyStructCpp;

5 个答案:

答案 0 :(得分:3)

声明后,您无法分配给数组。除此之外,语法也是错误的。如果它只有4个元素,那么就这样做,或者如果可以,只使用vector

struct MyStruct {

  MyStruct() {
    offsets[0] = 28;
    offsets[1] = 20;
    offsets[2] = 27;
    offsets[3] = 36;
  }

private:
  unsigned char offsets[4];
};

此外,不要使用下划线开始您的类型名称。这些是保留的,它可能导致肮脏。

答案 1 :(得分:1)

假设您拥有固定数量的值,Ed S的answer是合适的方式。

否则,您不能这样做,因为您只能初始化初始化列表中的变量成员,并且无法在初始化列表中进行此类分配。

但是,由于使用new,C#版本是可行的,所以在C ++中执行相同操作可能是一个很好的解决方案,但是,您必须具有offsets的长度并分配每个值单独:

typedef struct _MyStructCpp
{
    _MyStructCpp(int size)
    {
        _size = size; // Say 4
        offsets = new unsigned char[size];
        offsets[0] = 28;
        // etc....
    }
private:
    int _size;
    unsigned char* offsets;
}MyStructCpp;

但是,您应该记住,您刚刚分配了一个动态内存,因此您应该在析构函数中清除它。

答案 2 :(得分:0)

为您提供支持:

struct MyStructCpp
{
    private:
    unsigned char offsets[4]{28, 20, 27, 36};
};

好吧,既然你没有支持:

#include <algorithm>
#include <cstddef>
struct MyStruct
{
    MyStruct()
    {
        unsigned char temp[] = {28, 20, 27, 36};
        std::copy(temp, temp + MAX, offsets);
    }
    private:
    static const std::size_t MAX = 4;
    unsigned char offsets[MAX];
};

(但是,正如前面提到的std::vector会更好。如果我被限制使用普通的数组,那就显示出来了。)

答案 3 :(得分:0)

对于已修复大小的数组,请使用std::array<>

struct MyStructCpp
{
    MyStructCpp()
      : offsets(initOffsets())
    { }

private:
    std::array<unsigned char, 4> offsets;

    static std::array<unsigned char, 4> initOffsets()
    {
        std::array<unsigned char, 4> ret = {{28, 20, 27, 36}};
        return ret;
    }
};

所有非古代编译器都将通过NRVO在这里删除明显的副本。对于缺少std::array<>的标准库实现,请改用BoostArray

对于动态大小的数组,请使用std::vector<>。不要使用new,除非作为最后的手段。

(另外,不相关,但不要使用typedef struct成语 - 这是C语言中毫无意义且噪音很大的C语言。)

答案 4 :(得分:-3)

char offsets[4]={28,20,27,36};