Как работает многобайтовый символ ‘\ 377777’?

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-байтовый символ должен предупреждать своего пользователя?

Пожалуйста, объясните, как это работает. Есть ли у него разговорный или, возможно, нормативный термин?

godbolt.org/g/7AR9nw

0

Решение

Поведение при использовании более 3 цифр с восьмеричной константой, определяемой как \ и заключенные в одинарные кавычки не определены стандартом C ++. (Интересно, что вы можете определять константы с несколькими символами, используя более 2 шестнадцатеричных цифр или даже такие обозначения, как 'ab' но ценность int вы получаете это реализация определены.)

Обратитесь к документации вашего компилятора для обработки более длинной восьмеричной константы.

3

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

Других решений пока нет …

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