Лучшее название CHAR_BIT?

Я просто проверял ответ и понял это CHAR_BIT не определяется заголовками, как я ожидал бы, даже #include , на более новом GCC.

Сделайте я действительно имею к #include только получить "функциональность" CHAR_BIT?

16
задан Community 23 May 2017 в 11:54
поделиться

5 ответов

Как вы, возможно, знаете, не определено, хочет ли реализация включать другие заголовки. Это разрешено, но не обязательно. (§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 :: цифры (что эквивалентно).

24
ответ дан 30 November 2019 в 16:18
поделиться

Определите «новее». Случайная система 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 .

3
ответ дан 30 November 2019 в 16:18
поделиться

- это то место, где CHAR_BIT требуется стандартом C ++. Даже если вы случайно нашли его в , нет гарантии, что он там будет, поэтому вам лучше сразу обратиться к источнику. Не похоже, что что-то не так с включением .

6
ответ дан 30 November 2019 в 16:18
поделиться

Да, вам следует #include , чтобы получить определение CHAR_BIT . Это вовсе не узкое место для вашей программы (см. Комментарий ниже), и в дальнейшем вы можете столкнуться с тем, что портируете на другие платформы. Не каждая реализация имеет значение 8

0
ответ дан 30 November 2019 в 16:18
поделиться

Я сохраняю следующую функцию в моем .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
}
0
ответ дан 30 November 2019 в 16:18
поделиться