5

我有一个结构,其中包含一个unsigned char[16]我想初始化为零的字段。以下(高度简化的)代码可以使用 clang(OS X)编译:

struct GUID {
    unsigned char bytes[16];
    GUID() : bytes("\0\0\0\0""\0\0\0\0""\0\0\0\0""\0\0\0") {};
}

注意我使用 15 \0s,因为第 16 个是字符串文字的零终止符,如果你初始化一个包含太多字节的字符串,clang 会抱怨。

现在,当我尝试使用 GCC 4.5.3 (cygwin) 进行编译时,我得到:

error: incompatible types in assignment of 'const char [16]' to 'unsigned char [16]'

为什么它不起作用,我怎样才能使它起作用?(我显然可以在构造函数中循环遍历数组,但如果可能的话,我想使用初始化列表,我想了解它为什么在一个编译器中工作,而不是在另一个编译器中工作。)

4

3 回答 3

2

在这种情况下,一个简单的bytes()就足够了。你也可以考虑bytes { 0,0,0,0.... }

另外,使用std::array,而不是T[]。只有傻子能用的T[]时候才用std::array

于 2013-05-05T17:11:38.847 回答
2

由于我们正在处理 POD,因此足以显式构造字节,这将导致相应的内存被“归零”:

struct GUID 
{
    unsigned char bytes[16];
    GUID() : bytes(){}
};

可能值得注意的是,如果您没有在初始化列表中显式构造字节,它将保持未初始化状态

struct GUID 
{
    unsigned char bytes[16];
    GUID(){};
};

如果成员变量不是 POD 而是成员对象,那么它将调用其默认构造函数,而不是未初始化。

于 2013-05-05T17:45:09.320 回答
1

在 GUID 构造函数中,您可以使用 memset(bytes, 0, sizeof(bytes));

于 2013-05-05T17:07:21.913 回答