Я хотел бы static_assert()
, что подпись широких символов (L'x'
) соответствует значению wchar_t
.static_assert подпись широких букв символов?
Определение wchar_t
является моим собственным. (Я внедряю стандартную библиотеку C.) Я хотел бы провалиться раньше, не получится громко, если у компилятора, используемого пользователем, есть другое представление о широком значении символов, чем то, что настроено в библиотеке.
Утверждая комбинационной размер типов легко:
static_assert(sizeof(wchar_t) == sizeof(L'x'), "size matches");
Для встроено типа char
, тестирование знаковость легко. Предполагая, что существует _CHAR_IS_SIGNED
определяется либо 0, либо 1 где-то,
static_assert(((char)-1 < 0) == _CHAR_IS_SIGNED, "char is signed");
делает трюк.
Но wchar_t
является не является встроенным типом ...
Есть ли способ сделать это (статическое) утверждение в «чистом» С99 или С11, то есть, не полагаясь на расширениях конкретного компилятора?
Разъяснение:
Я "" библиотека. У меня есть typedef
некоторый целочисленный тип до wchar_t
.
Компилятор - не я - определяет широкие литералы символов для некоторого типа. Этот тип не присвоил имя компилятору, но в идеале должен быть идентичен тому, что я использую для wchar_t
, включая подпись (которая, AFAICT, не указана стандартом).
Я хотел бы утвердить/проверить идентичность этих типов в некотором роде. Ошибка (type)-1 < 0
, указанная для char
выше, не работает, , потому что я не могу назвать «тип, используемый компилятором для литералов».
Сверху моей головы: литье '-1' в требуемый тип? – LPs
@LPs: Вопрос в основном, как мне придать '-1'' typeof (L'x ') 'без такой вещи, как' typeof() '? – DevSolar
'_CHAR_IS_SIGNED' не является стандартным макросом. Лучшим подходом было бы обеспечить соблюдение 'signed' или' unsigned' 'wchar_t'. Во всяком случае, широкая поддержка символов в стандарте C несколько порвана. И большинство современных систем используют UTF-8. – Olaf