Лучшее имя для CHAR_BIT?

Я был просто проверял ответ и понял, что CHAR_BIT не определяется заголовками, как я ожидал, даже не с помощью #include <bitset>, на новых GCC.

Мне действительно нужно #include <climits> просто получить "функциональность" CHAR_BIT?

Ответы

Ответ 1

Как вы знаете, независимо от того, хочет ли реализация включить другие заголовки, не указывается. Это разрешалось, но не было санкционировано. (§17.4.4.1). Таким образом, вы либо должны быть явными, либо знать свои гарантии.

Единственный раз, когда заголовок С++ должен включать другой, требуется, если требуется определение в другом. Например, <bitset> требуется включить <cstddef> для std::size_t, поскольку это явно указано в стандарте. (§23.3.5, для этого примера)

Для встречного примера рассмотрим <limits>. Он может включать <climits> и определять значения для numeric_limits в терминах макросов внутри, и это часто делает, поскольку это проще всего для реализации. Но в стандарте есть такие вещи, как "Эквивалент CHAR_MIN, SHRT_MIN, FLT_MIN, DBL_MIN и т.д." но не говорит, что он должен быть реализован с точки зрения тех, что означает <climits> не обязательно.

Таким образом, единственный способ гарантировать, что CHAR_BIT определен, - это включить <climits> или какой-либо другой заголовок, где он явно указал, что он должен его включать. И, насколько я могу судить, никому не нужно; реализация может просто жестко закодировать значение везде, где это необходимо, например, или включить <limits> и использовать std::numeric_limits<unsigned char>::digits (что эквивалентно).

Ответ 2

Если вы не программируете DSP, лучшее имя для него - 8. POSIX и Windows требуют CHAR_BIT==8, и это охватывает практически любую интересную цель, за исключением DSP. (Я бы больше не рассматривал мэйнфреймы 1970-х годов как потенциально интересную цель, но, возможно, кто-то будет просить отличия...)

Ответ 3

<climits> - это где CHAR_BIT требуется по стандарту С++. Даже если вам удалось найти его в <bitset>, он не будет гарантированно находиться там, поэтому вам лучше идти прямо к источнику. Его не похоже на что-то не так с включением <climits>.

Ответ 4

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

Ответ 5

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

Ответ 6

Я сохраняю следующую функцию в моем .profile, чтобы проверить определенные константы компилятора. В моей системе __CHAR_BIT__ присутствует, что означает, что заголовок не требуется, если вы можете жить с двойной формой подчеркивания, которая может работать только с gcc.

defines () 
{ 
    touch /tmp/defines.h;
    cpp -dD "[email protected]" /tmp/defines.h | awk '$1!="#"{COUNT+=1;print;}END{printf("count %d\n",COUNT);}' | sort;
    rm /tmp/defines.h
}