Jump to content

    

Переменная типа bool

Всем доброго времени суток.

Пишу на C под CW6.1 и столкнулся с отсутствием типа bool как таковой.

Вернее тип есть, если подключить библиотеку, но при этом по факту переменная получается int и соответственно занимает 2 байта (1 байт если беззнаковый).

Как правильно создать тип bool, для работы именно на уровне битов, а то занимать кучу памяти для регистров состояния накладно.

Заранее благодарен.

Share this post


Link to post
Share on other sites
Как правильно создать тип bool, для работы именно на уровне битов, а то занимать кучу памяти для регистров состояния накладно.

 

Тип bool практически всегда занимает столько же места, сколько и int. Если вам нужен именно бит, копайте в сторону bitfields. Если ваш компилятор позволяет, их можно объединить в анонимную структуру. Если нет - придется структуру обозвать.

 

P.S. что-то цитирование поломалось...

Share this post


Link to post
Share on other sites

В Standard C (ANSI C) типа bool вообще нету. Его ввели только в C99. По стандарту C99 макрос bool разворачивается в константу типа _Bool, которая имеет размерность integer и принимает значения true = 1 или false = 0. Определение типа bool находится в хедере stdbool.h.

ISO/IEC 9899:1999 (E) ©ISO/IEC

7.16 Boolean type and values <stdbool.h>

1. The header <stdbool.h> defines four macros.

2. The macro

bool

expands to _Bool.

3. The remaining three macros are suitable for use in #if preprocessing directives. They

are

true

which expands to the integer constant 1,

false

which expands to the integer constant 0, and

_ _bool_true_false_are_defined

which expands to the integer constant 1.

Notwithstanding the provisions of 7.1.3, a program may undefine and perhaps then

redefine the macros bool, true, and false.

213)

 

Угу. Какая-то беда с цитированием приключилась. :(

Share this post


Link to post
Share on other sites

Прошу прощения за отступление от темы, вынужден проверить возможности цитрования по запросу пользователя

 

Как правильно создать тип bool, для работы именно на уровне битов, а то занимать кучу памяти для регистров состояния накладно.

 

Все заработало, слегка поправил настройки

Share this post


Link to post
Share on other sites
По стандарту C99 макрос bool разворачивается в константу типа _Bool, которая имеет размерность integer...

Я не совсем понял, что значит "_Bool ... имеет размерность integer". Если это значит, что переменная типа _Bool будет занимать столько же байт, что и переменная типа int, то это неверно. В стандарте C99 это нигде не сказано. К тому же, например, компилятор Си для ColdFire от фирмы Green Hills выделяет под переменные типа _Bool 1 байт, в то время как int занимает 4 байта. На мой взгляд, Green Hills знает толк в компиляторах, по крайней мере код генерится отличный.

Однако, не стоит ожидать, что _Bool сможет занимать один бит, кроме как в битовых полях. Это связано с тем, что язык Си позволяет делать такие вещи, как опрелелять массивы _Bool, члены структур _Bool, выполнять адресную арифметику с переменными типа _Bool. Всё вышеперечисленное было бы очень трудно реализовать, если бы _Bool занимал только 1 бит.

Некоторые компиляторы определяют нестандартный тип для однобитовых переменных (скажем, bit). Можно заменить стандартный stdbool.h на свой, где будет "#define bool bit". Только при это не получится сделать массив типа bool, член структуры типа bool и т.д. (см. выше).

Share this post


Link to post
Share on other sites

Дык никто и не запрещает переопределить типы данных и пользоваться своими (одинаковыми) типами на различных платформах. Вот только с битовым типом bool я бы не рискнул связываться. В крайнем случае сделать его 8-ми битовым типом unsigned char.

Share this post


Link to post
Share on other sites

Решение найдено.

typedef struct {
char b0:1;
...
char b7:1;
} bit1byte;

bit1byte Status;

if (Status.b0 = 0x1) { // BRSET
...
}

Status:b0 = 0x1; // BSET

При этом можно использовать и больше одного байта для флагов.

Share this post


Link to post
Share on other sites
... Я вам о нем написал в первом же ответе.

Поразительно, как часто люди забывают, что нужно не только писать вопросы, но и читать ответы :-)

Share this post


Link to post
Share on other sites
Поразительно, как часто люди забывают, что нужно не только писать вопросы, но и читать ответы :-)

Я читал все ответы, просто для остальных интересующихся данным вопросом привёл рабочий пример, дабы полностью закрыть вопрос.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this