Я просто проверял ответ и понял это CHAR_BIT
не определяется заголовками, как я ожидал бы, даже #include
, на более новом GCC.
Сделайте я действительно имею к #include
только получить "функциональность" CHAR_BIT
?
Как вы, возможно, знаете, не определено, хочет ли реализация включать другие заголовки. Это разрешено, но не обязательно. (§17.4.4.1) Таким образом, вы должны либо быть явным, либо знать свои гарантии.
Заголовок C ++ должен включать другой заголовок только в том случае, если он требует определения в другом. Например,
требуется для включения
для std :: size_t
, поскольку это явно указано в стандарте. (§23.3.5, для этого примера)
В качестве контрпримера рассмотрим
. Он может включать
и определять значения для numeric_limits
в терминах макросов внутри, и часто так и происходит, поскольку это проще всего для реализации. Но все, что в стандарте сказано: « Эквивалент CHAR_MIN
, SHRT_MIN
, FLT_MIN
, DBL_MIN
, и т.п."но не говорит, что должен быть реализован в терминах тех, что означает, что
не нужно включать.
Так что единственный способ, которым вы можете гарантировано , что CHAR_BIT
определен путем включения
или какого-либо другого заголовка, в котором явно указано, что он должен включать его. И насколько я могу скажите, никто не должен; реализация может просто жестко закодировать значение везде, где это необходимо, например, или включить
и использовать std :: numeric_limits
(что эквивалентно).
Определите «новее». Случайная система Linux дала мне следующие результаты:
~> gcc --version gcc (GCC) 4.1.2 (Gentoo 4.1.2) [snip] ~> grep CHAR_BIT /usr/include/*.h /usr/include/limits.h:# define CHAR_BIT 8
Разве это не подходит? В C я думаю, что всегда должно быть достаточно , чтобы включить limits.h
, чтобы получить CHAR_BIT
.
- это то место, где CHAR_BIT требуется стандартом C ++. Даже если вы случайно нашли его в
, нет гарантии, что он там будет, поэтому вам лучше сразу обратиться к источнику. Не похоже, что что-то не так с включением
.
Да, вам следует #include
, чтобы получить определение CHAR_BIT
. Это вовсе не узкое место для вашей программы (см. Комментарий ниже), и в дальнейшем вы можете столкнуться с тем, что портируете на другие платформы. Не каждая реализация имеет значение 8
Я сохраняю следующую функцию в моем .profile для проверки констант, определенных компилятором. В моей системе __ CHAR_BIT __
находится там, что означает, что заголовок не требуется, если вы можете жить с формой двойного подчеркивания, которая может работать только с gcc.
defines ()
{
touch /tmp/defines.h;
cpp -dD "$@" /tmp/defines.h | awk '$1!="#"{COUNT+=1;print;}END{printf("count %d\n",COUNT);}' | sort;
rm /tmp/defines.h
}