我有一个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 \0
,因为第16个是字符串文字的零终止符,如果你初始化一个字节太多的字符串,则clang会抱怨。
现在,当我尝试使用GCC 4.5.3(cygwin)进行编译时,我得到:
error: incompatible types in assignment of 'const char [16]' to 'unsigned char [16]'
为什么它不起作用,我怎样才能使它工作? (我显然可以在构造函数中循环遍历数组,但是如果可能的话我想使用初始化列表,我想了解它为什么在一个编译器中工作,而不是另一个编译器。)
答案 0 :(得分:2)
在这种情况下,简单的bytes()
就足够了。您还可以考虑bytes { 0,0,0,0.... }
。
另外,请使用std::array
,而不是T[]
。只有傻瓜才能使用T[]
时使用std::array
。
答案 1 :(得分:2)
由于我们正在处理POD,它足以显式构造字节,这将导致相应的内存被“置零”:
struct GUID
{
unsigned char bytes[16];
GUID() : bytes(){}
};
值得注意的是,如果你没有在初始化列表中显式构造字节,那么它将保持未初始化
struct GUID
{
unsigned char bytes[16];
GUID(){};
};
如果成员变量不是POD而是成员对象,那么它将调用其默认构造函数而不是未初始化。
答案 2 :(得分:1)
在GUID构造函数中,您可以使用 memset(bytes,0,sizeof(bytes));