Я пишу модульный тест, проверяющий некоторые двоичные данные относительно ожидаемого массива. Ожидаемый массив, о котором идет речь, это всего лишь несколько байтов, конкретно не имеет значения:
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
).
Так что в 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};
^~~~