如何从字符串文字初始化unsigned char数组?

时间:2013-05-05 16:58:14

标签: c++ c-strings

我有一个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]'

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

3 个答案:

答案 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));