Clang упомянул эту штуку мне, когда я пытался найти несколько нестандартных способов найти std::numeric_limits<size_t>::max()
для меня allocator::max_size()
Кажется, что размер выражения ограничен 4 байтами, поэтому он выглядит как многобайтовый символ, определенный как impl, но я не знаю, как именно он работает.
printf("0x%016hhX\n", '\377'); // 0x00000000000000FF
printf("0x%016X \n", '\3777'); // 0x000000000000FF37
printf("0x%016X \n", '\37777'); // 0x0000000000FF3737
printf("0x%016X \n", '\377777'); // 0x00000000FF373737 [-Wfour-char-constants]
printf("0x%016X \n", '\3777777'); // 0x0000000037373737 [ too long ]
printf("0x%016X \n", '\3777777'); // 0x0000000037373737 [ too long ]
Строки 2 — 4, кажется, возвращают int, но только 4-я строка предупреждает о -Wfour-char-constants
если включить -Weveryting
, Почему 4-байтовый символ должен предупреждать своего пользователя?
Пожалуйста, объясните, как это работает. Есть ли у него разговорный или, возможно, нормативный термин?
Поведение при использовании более 3 цифр с восьмеричной константой, определяемой как \
и заключенные в одинарные кавычки не определены стандартом C ++. (Интересно, что вы можете определять константы с несколькими символами, используя более 2 шестнадцатеричных цифр или даже такие обозначения, как 'ab'
но ценность int
вы получаете это реализация определены.)
Обратитесь к документации вашего компилятора для обработки более длинной восьмеричной константы.
Других решений пока нет …