2013-05-05 136 views
5

我有一个unsigned char[16]字段的结构,我想初始化为零。下面的(非常简化的)代码编译罚款铿锵(OS X):如何从字符串文字初始化一个unsigned char数组?

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日是零终止字符串字面量,如果你初始化字符串铛抱怨字节太多。

现在,当我尝试用GCC 4.5.3(Cygwin的)来编译,我得到:

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

为什么它不工作,我怎样才能使它发挥作用? (我明显可以在构造函数中遍历数组,但我希望尽可能使用初始化列表,但我想知道它为什么在一个编译器中工作,但不是另一个编译器。)

回答

1

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

+0

对,这可能是最干净的解决方案,我会做什么。 – jdm 2013-05-05 17:10:45

+0

不,对于您的特殊情况,最好的解决方案是DeadMG的解决方案。 – 2013-05-05 17:15:01

+0

@Haroogan:如果我使用bytes(),数组是否保证填充零? – jdm 2013-05-05 17:32:57

2

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

2

因为我们正在处理的POD它足以明确构建个字节,这将导致在相应的内存被“归零”:

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

这也许值得一提的是,如果你没有明确构建个字节在初始化列表,它会被未初始化

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

如果该成员变量不是一个POD,而是一个成员对象,然后,而不是被未初始化它会调用它的默认构造函数。