如何从字符串字面量初始化一个无符号字符数组?

5

我有一个结构体,其中包含一个unsigned char[16]类型的字段,我想将其初始化为0。以下是(大大简化后的)代码,在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个\0,因为第16个是字符串字面值的零终止符,如果你用过多的字节初始化一个字符串,clang会抱怨。
现在,当我尝试使用GCC 4.5.3(cygwin)编译时,我得到以下错误:
error: incompatible types in assignment of 'const char [16]' to 'unsigned char [16]'

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

3个回答

2

由于我们正在处理POD,因此只需明确构造字节即可,这将导致相应的内存被“清零”:

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

值得注意的是,如果在初始化列表中没有明确构造字节,则会保持未初始化状态。
struct GUID 
{
    unsigned char bytes[16];
    GUID(){};
};

如果成员变量不是POD类型而是成员对象,那么在未初始化的情况下会调用其默认构造函数。

2
在这种情况下,一个简单的bytes()应该足够了。你也可以考虑使用bytes { 0,0,0,0.... }
此外,使用std::array而不是T[]。只有傻瓜在可以使用std::array的情况下才会使用T[]

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

好的,那可能是最干净的解决方案,也是我要做的。 - jdm
不,针对您的特定情况,最好的解决方案是DeadMG提供的那个。 - Alexander Shukaev
@Haroogan:如果我使用bytes(),数组是否保证填充为零? - jdm
1
是的,没错。基本上这就是DeadMG告诉你的。 - Alexander Shukaev

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接