2009-12-17 4 views
16

Просто интересно, если u_char является стандартом. Я всегда использовал его, полагая, что он определен вместе с типами uintX_t и так далее. Но я вижу, что некоторые из нашего кода переходят от u_char к «unsigned char» по причине «поэтому пользователям не нужно определять самих u_char».Является ли u_char стандартом?

+5

u_char не является частью официального стандарта ANSI C –

ответ

4

Он отсутствует в каких-либо старых файлах заголовков (кроме определенных определенных областей , как Kerberos и сетевые заголовки), а не встроенный тип в любом компиляторе, о котором я знаю.

12

Строка u_char не появляется в этом проекте стандарта C:

http://www.open-std.org/jtc1/sc22/WG14/www/docs/n1256.pdf

Это не требует POSIX либо, насколько я знаю.

Я думаю, что это в BSD (sys/types.h) и Windows (winsock.h). Я бы не стал считать, что это «стандарт» - они не являются официальными стандартами, и они, конечно же, не являются частью стандарта C, но они четко определены и документированы.

+1

Кроме того, проблема использования этих уродливых нестандартных типов заключается в том, что вы должны быть очень осторожны в их определении. Некоторые системы уже будут определять их (что неверно), что приводит к ошибкам, если вы сами определяете их, а другие - нет, то есть вы не можете использовать этот тип, если сами не определяете его. Самый безопасный способ - просто не использовать этот мусор, а не лениться и выписать 'unsigned char', когда вы это имеете в виду. –

+0

@R .. или используйте '' для 'uint8_t', ... типов. –

+5

@JonathonReinhart: используя 'uint8_t', имеет встроенное утверждение, что' CHAR_BIT == 8', поскольку тип запрещен к существованию, если 'CHAR_BIT> 8'. Это нормально, если вам нужен 8-битный тип, но если вы имеете в виду «целое число без знака, занимающее одну единицу хранения в этой реализации, независимо от того, что может быть», тогда вы должны сказать, что: 'unsigned char'. –

5

Нет, u_char нестандартен. Если вам нужен стандартный тип, эквивалентный u_char, вы можете использовать uint8_t, который является частью стандартной библиотеки C99 (проверьте свои конкретные платформы/компиляторы для соответствия C99). stdint.h определяет этот тип (наряду со многими другими конкретными интегральными типами). This Wikipedia article contains more information about stdint.h.

Смежные вопросы