2013-05-05 3 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

В конструктор GUID вы можете использовать memset (байты, 0, размерof (байты));

+0

Правильно, это, наверное, самое чистое решение и что я буду делать. – jdm

+0

Нет, для вашего конкретного случая лучшим решением является решение DeadMG. –

+0

@Haroogan: Является ли массив гарантированным заполнением нулями, если я делаю байты()? – jdm

2

Простой bytes() должен быть достаточным в этом случае. Вы также можете рассмотреть bytes { 0,0,0,0.... }.

Кроме того, используйте std::array, а не T[]. Только дураки используют T[], когда они могут использовать std::array.

2

Поскольку мы имеем дело с POD ее достаточной для построения явно байт, что приведет к соответствующей памяти, «обнуляется»:

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

Это, вероятно, стоит отметить, что если вы не явно построить байт в списке инициализации, то осталось бы неинициализированным

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

Если переменная-член не POD, но вместо этого были объектом член то вместо того, чтобы осталось неинициализированным было бы назвать его конструктор по умолчанию.

 Смежные вопросы

  • Нет связанных вопросов^_^