|
|
|
Переменная типа bool, Как правильно создать |
|
|
|
Sep 1 2008, 13:10
|
Гуру
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095
|
Цитата(Wiener @ Sep 1 2008, 15:47) Как правильно создать тип bool, для работы именно на уровне битов, а то занимать кучу памяти для регистров состояния накладно. Тип bool практически всегда занимает столько же места, сколько и int. Если вам нужен именно бит, копайте в сторону bitfields. Если ваш компилятор позволяет, их можно объединить в анонимную структуру. Если нет - придется структуру обозвать. P.S. что-то цитирование поломалось...
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Sep 1 2008, 13:13
|
Гуру
Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882
|
В 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) Угу. Какая-то беда с цитированием приключилась.
|
|
|
|
|
Sep 1 2008, 16:33
|
Гуру
Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136
|
Цитата(rezident @ Sep 1 2008, 17:13) По стандарту 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 и т.д. (см. выше).
|
|
|
|
|
Sep 11 2008, 10:46
|
Участник
Группа: Почетный участник
Сообщений: 42
Регистрация: 30-01-06
Из: Москва
Пользователь №: 13 758
|
Решение найдено. Код typedef struct { char b0:1; ... char b7:1; } bit1byte;
bit1byte Status;
if (Status.b0 = 0x1) { // BRSET ... }
Status:b0 = 0x1; // BSET При этом можно использовать и больше одного байта для флагов.
|
|
|
|
|
Sep 15 2008, 10:07
|
Участник
Группа: Почетный участник
Сообщений: 42
Регистрация: 30-01-06
Из: Москва
Пользователь №: 13 758
|
Цитата(scifi @ Sep 15 2008, 11:04) Поразительно, как часто люди забывают, что нужно не только писать вопросы, но и читать ответы :-) Я читал все ответы, просто для остальных интересующихся данным вопросом привёл рабочий пример, дабы полностью закрыть вопрос.
|
|
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|