Создать массив символов, избегая сужения

Я пишу модульный тест, проверяющий некоторые двоичные данные относительно ожидаемого массива. Ожидаемый массив, о котором идет речь, это всего лишь несколько байтов, конкретно не имеет значения:

char expected[] = {0x42, 0xde, 0xad, 0xbe, 0xef};

Это хорошо скомпилировано в C ++, но в C ++ 11 выдает предупреждение о сужающемся преобразовании. Я собираю с -Werror потому что предупреждения имеют значение, так что эта строка для меня не компилируется. Насколько я знаю, буквального суффикса для char нет, поэтому, похоже, мне придется сделать следующее:

char expected[] = {static_cast<char>(0x42), static_cast<char>(0xde), ... };

Это кажется довольно громоздким для меня. Есть ли лучший способ построить этот массив символов? (Вне либо удаления -Werror или добавление -Wno-narrowing).

5

Решение

Так что в C ++ 11 есть исключение для целое число типы и перечисления с незаданной областью за константные выражения, подходящие после объявления в целевом типе черновик стандартного раздела C ++ 11 8.5.4 [Dcl.init.list] говорит:

от целочисленного типа или перечислимого типа с незаданной областью к целочисленному типу
которые не могут представлять все значения исходного типа, кроме
где источник является константным выражением, значение которого после интеграла
рекламные акции будут соответствовать целевому типу.

Проблема в том, что некоторые значения не вписываются в char если вы используете unsigned char вместо этого это должно работать.

clang является немного более полезным в том, что он предупреждает, какие конкретные элементы генерируют предупреждение, и в этом случае он не предупреждает 0x42 но для остальных, например:

error: constant expression evaluates to 222 which cannot be narrowed to type 'char' [-Wc++11-narrowing]
char expected[] = {0x42, 0xde, 0xad, 0xbe, 0xef};
^~~~
5

Другие решения


По вопросам рекламы [email protected]