BOOL или bool?
От: Olearda Россия нет
Дата: 15.06.02 20:42
Оценка:
Какая разница между bool и BOOL
Хороший программист характеризуется умением доказать почему задачу невозможно выполнить, когда ему просто лень её выполнять.
Re: BOOL или bool?
От: Osco Португалия http://progs.biz
Дата: 15.06.02 21:11
Оценка: 3 (1)
Здравствуйте Olearda, Вы писали:

O>Какая разница между bool и BOOL

Да просто это разные типы данных. BOOL (значения — TRUE и FALSE) из Windows, bool (значения true и false) — из C++. Хотя часто и взаимозаменяемые. Но ошибку можно потом искато долго.
И в памяти разное место требуют (см. sizeof()).
Osco do Casco
Re[2]: BOOL или bool?
От: SergH Россия  
Дата: 15.06.02 21:52
Оценка: 2 (1)
Здравствуйте Osco, Вы писали:

O>Да просто это разные типы данных. BOOL (значения — TRUE и FALSE) из Windows, bool (значения true и false) — из C++. Хотя часто и взаимозаменяемые. Но ошибку можно потом искато долго.

O>И в памяти разное место требуют (см. sizeof()).

Если не ошибаюсь, BOOL это typedef для DWORD или чего-то подобного, поэтому он может пренимать гораздо больше значений. В MSDN про многие функции написано, что они возвращают FALSE в случае провала и не-FALSE (а не TRUE) в случае успеха, хотя их возвращаемый тип определён как BOOL.

А bool — стандартный С++ тип данных, который может пренимать значения только true и false

Кроме того, bool отсутствует в C (че-то я слышал, что в C99 ввели, но мог и ослышаться).
Делай что должно, и будь что будет
Re: BOOL или bool?
От: artem_ Украина  
Дата: 16.06.02 10:11
Оценка:
Здравствуйте Olearda, Вы писали:

O>Какая разница между bool и BOOL

разница очень существенная, особенно когда используешь в DLL, т.к. bool-1 байт, а BOOL 4 байта
кроме того в windef.h есть такая строчка

typedef int                 BOOL;



Осуществимо все, что представимо!
Re: BOOL или bool?
От: AntonS Россия  
Дата: 16.06.02 10:11
Оценка:
Здравствуйте Olearda, Вы писали:

O>Какая разница между bool и BOOL

Принципиально не знаю, но пишут, что в Visual Studio принят BOOL, т.к. его использовали до официального принятия bool, видимо он там так и остался...
Re[2]: BOOL или bool?
От: Аноним  
Дата: 16.06.02 10:26
Оценка:
Здравствуйте AntonS, Вы писали:

AS>Здравствуйте Olearda, Вы писали:


O>>Какая разница между bool и BOOL

AS>Принципиально не знаю, но пишут, что в Visual Studio принят BOOL, т.к. его использовали до официального принятия bool, видимо он там так и остался...
:shuffle:
Ну подумаешь, чуть-чуть обложался :)
Re[3]: BOOL или bool?
От: Jenyay http://jenyay.net
Дата: 16.06.02 11:52
Оценка:
Здравствуйте SergH, Вы писали:

SH>Если не ошибаюсь, BOOL это typedef для DWORD или чего-то подобного, поэтому он может пренимать гораздо больше значений. В MSDN про многие функции написано, что они возвращают FALSE в случае провала и не-FALSE (а не TRUE) в случае успеха, хотя их возвращаемый тип определён как BOOL.


Точнее typedef int BOOL;
Софт, исходники и фото
Re[2]: BOOL или bool?
От: Bell Россия  
Дата: 16.06.02 13:35
Оценка:
Здравствуйте artem_, Вы писали:

A>Здравствуйте Olearda, Вы писали:


O>>Какая разница между bool и BOOL

A>разница очень существенная, особенно когда используешь в DLL, т.к. bool-1 байт, а BOOL 4 байта
A>кроме того в windef.h есть такая строчка

A>
A>typedef int                 BOOL;
A>



A>


Это частный случай. Вот что написано по этому поводу в MSDN:

Microsoft Specific 

In Visual C++4.2, the Standard C++ header files contained a typedef that equated bool with int. 
In Visual C++ 5.0 and later, bool is implemented as a built-in type with a size of 1 byte. 
That means that for Visual C++ 4.2, a call of sizeof(bool) yields 4, while in Visual C++ 5.0 and
 later, the same call yields 1. This can cause memory corruption problems if you have defined 
structure members of type bool in Visual C++ 4.2 and are mixing object files (OBJ) and/or DLLs built 
with the 4.2 and 5.0 or later compilers. 

END Microsoft Specific


А вот что написано в стандарте C++ (5.3.3 Sizeof):

...
sizeof(bool) and sizeof(wchar_t) are implementation defined


Хотя конечно в VC6 sizeof(int) == 4, а sizeof(bool) == 1
Любите книгу — источник знаний (с) М.Горький
Re[2]: BOOL или bool?
От: Kaa Украина http://blog.meta.ua/users/kaa/
Дата: 16.06.02 16:28
Оценка:
Здравствуйте AntonS, Вы писали:

AS>Здравствуйте Olearda, Вы писали:


O>>Какая разница между bool и BOOL

AS>Принципиально не знаю, но пишут, что в Visual Studio принят BOOL, т.к. его использовали до официального принятия bool, видимо он там так и остался...

Ну да, ну да... В С++ логического типа изначально не было. Но в Win16 народу очень хотелось что-то такое иметь. Отсюда, вроде бы, появился BOOL. Потом народ наваял кучу кода для Win16, и при появлении Win32 встал вопрос, как при перемене разрядности программы там, где это можно, сделать так, чтоб все работало (понятно, что код, завязанный на размер типа в байтах, прийдется переписывать). Тогда все эти макросы и тайпдэфы и перекочевали в Win32-программирование в неизменном виде, где это было возможно. Так-что, надо говорить "в программировании под Win32...".

Я вот, например, переносимые на юниксы с помощью VS прграммы пишу, так что мне виндовые типы как-то ни к селу, ни к городу, хотя 99.8% времени я провожу в VS.
Алексей Кирдин
Re[3]: BOOL или bool?
От: Mr-Twister http://cosmozo.narod.ru/
Дата: 16.06.02 17:09
Оценка:
Здравствуйте Kaa, Вы писали:


Kaa>Я вот, например, переносимые на юниксы с помощью VS прграммы пишу, так что мне виндовые типы как-то ни к селу, ни к городу, хотя 99.8% времени я провожу в VS.


Интересно, проверка на правильность в графической среде, а потом код, компилить в Unix ?
дас ист нихьт фантастиш, дас ист руссиш Ванюшка
Re[4]: BOOL или bool?
От: Kaa Украина http://blog.meta.ua/users/kaa/
Дата: 16.06.02 17:15
Оценка:
Здравствуйте Mr-Twister, Вы писали:

MT>Интересно, проверка на правильность в графической среде, а потом код, компилить в Unix ?


Я про компиляторы говорю, а они и у MS — консольные приложения (поищи cl.exe). Код должон компилиться gcc и VC6.0 — таково требование проекта.
Алексей Кирдин
Re[3]: BOOL или bool?
От: m.a.g. Мальта http://dottedmag.net/
Дата: 17.06.02 05:16
Оценка:
Здравствуйте SergH, Вы писали:

SH>Если не ошибаюсь, BOOL это typedef для DWORD или чего-то подобного, поэтому он может пренимать гораздо больше значений. В MSDN про многие функции написано, что они возвращают FALSE в случае провала и не-FALSE (а не TRUE) в случае успеха, хотя их возвращаемый тип определён как BOOL.


Мало того, DialogProc в windows должен возвращать BOOL и я видел по крайней мере одно сообщение, в описании которого говорится, что нужно возвращаемый DWORD скастить в BOOL и возвращать спокойно Вот вам и логический тип
Re[4]: BOOL или bool?
От: SergH Россия  
Дата: 17.06.02 07:41
Оценка:
Здравствуйте m.a.g., Вы писали:

...>Мало того, DialogProc в windows должен возвращать BOOL и я видел по крайней мере одно сообщение, в описании которого говорится, что нужно возвращаемый DWORD скастить в BOOL и возвращать спокойно Вот вам и логический тип


А что за сообщение, если не секрет? Обычно, когда диалогу нужно вернуть результат это делается через SetWindowLong(hDlg, DWL_MSGRESULT, value). Например, так wizard'ы реагируют на WM_NOTIFY + PSN_QUERYCANCEL.
Делай что должно, и будь что будет
Re[5]: BOOL или bool?
От: VVV Россия  
Дата: 17.06.02 11:53
Оценка: 6 (1)
Здравствуйте SergH, Вы писали:

SH>Здравствуйте m.a.g., Вы писали:


...>>Мало того, DialogProc в windows должен возвращать BOOL и я видел по крайней мере одно сообщение, в описании которого говорится, что нужно возвращаемый DWORD скастить в BOOL и возвращать спокойно Вот вам и логический тип


SH>А что за сообщение, если не секрет? Обычно, когда диалогу нужно вернуть результат это делается через SetWindowLong(hDlg, DWL_MSGRESULT, value). Например, так wizard'ы реагируют на WM_NOTIFY + PSN_QUERYCANCEL.


сообщение такое WM_CTLCOLORDLG
Return Values
If an application processes this message, it must return a handle to a brush. The system uses the brush to paint the background of the dialog box.

Remarks
...
If a dialog box procedure handles this message, it should cast the desired return value to a BOOL and return the value directly. If the dialog box procedure returns FALSE, then default message handling is performed. The DWL_MSGRESULT value set by the SetWindowLong function is ignored.

насчёт bool и BOOL — тут не надо забывать, что под Винду пишут на разных языках — не только на C++, поэтому если программист пишет DLL для подключения к чему-нибудь (плагины) или COM объект, то неизвестно из какого языка придёт вызов, поэтому тут надо использовать Виндовые типы (BOOL). Внутри же своего проекта можно безболезненно использовать типы языка (в С++ например — bool).
Re: BOOL или bool?
От: qwe98765  
Дата: 18.06.02 19:39
Оценка:
Здравствуйте Olearda, Вы писали:

O>Какая разница между bool и BOOL


Если еще интересно, то вот такую таблицу я составил недавно, когда потребовалось узнать "всю правду" про эти два типа, может кому полезно будет:

-------------------------------------------------------------------------------
ISO C ISO C++ MSVC GCC
-------------------------------------------------------------------------------
bool | defined as alias| generic integral| 8 bits size | 32 bits size
| to _Bool type in| type | |
| stdbool.h | | |
-------|-----------------|-----------------|-----------------|-----------------
BOOL | n/a | n/a | typedefed as int| n/a
| | | in windef.h |
| | | (non-console) |
| | | 32 bits size |
-------|-----------------|-----------------|-----------------|-----------------
_Bool | generic type, | n/a | n/a | conforms to ISO,
| corresponds to | | | 32 bits size
| unsigned int | | |
-------|-----------------|-----------------|-----------------|-----------------
true | defined as 1 in | generic literal | 8 bits size | 32 bits size
| stdbool.h | of type bool | equals 1 | equals 1
-------|-----------------|-----------------|-----------------|-----------------
false | defined as 0 in | generic literal | 8 bits size | 32 bits size
| stdbool.h | of type bool | equals 0 | equals 0
-------|-----------------|-----------------|-----------------|-----------------
TRUE | n/a | n/a | defed @ windef.h| n/a
| | | 32 bits size |
| | | equals 1 |
-------|-----------------|-----------------|-----------------|-----------------
FALSE | n/a | n/a | defed @ windef.h| n/a
| | | 32 bits size |
| | | equals 0 |
-------------------------------------------------------------------------------

Important notes:
— MSVC fails to conform to ISO C by not defining _Bool and not providing
stdbool.h
— bool, true, false sizes are different in MSVC and GCC

Если найдете здесь неточности, плз, напишите сюда, буду благодарен
Re[2]: BOOL или bool?
От: qwe98765  
Дата: 18.06.02 19:41
Оценка:
Сорри, запоганилась таблица. Надо было пользоваться предпросмотром, кривые мои ручки... Попробую через кляузу...


-------------------------------------------------------------------------------
              ISO C            ISO C++            MSVC              GCC
-------------------------------------------------------------------------------
bool   | defined as alias| generic integral| 8 bits size     | 32 bits size
       | to _Bool type in| type            |                 |
       | stdbool.h       |                 |                 |
-------|-----------------|-----------------|-----------------|-----------------
BOOL   |       n/a       |       n/a       | typedefed as int|       n/a
       |                 |                 | in windef.h     |
       |                 |                 | (non-console)   |
       |                 |                 | 32 bits size    |
-------|-----------------|-----------------|-----------------|-----------------
_Bool  | generic type,   |       n/a       |       n/a       | conforms to ISO,
       | corresponds to  |                 |                 | 32 bits size
       | unsigned int    |                 |                 |
-------|-----------------|-----------------|-----------------|-----------------
true   | defined as 1 in | generic literal | 8 bits size     | 32 bits size
       | stdbool.h       | of type bool    | equals 1        | equals 1
-------|-----------------|-----------------|-----------------|-----------------
false  | defined as 0 in | generic literal | 8 bits size     | 32 bits size
       | stdbool.h       | of type bool    | equals 0        | equals 0
-------|-----------------|-----------------|-----------------|-----------------
TRUE   |       n/a       |       n/a       | defed @ windef.h|       n/a
       |                 |                 | 32 bits size    |
       |                 |                 | equals 1        |
-------|-----------------|-----------------|-----------------|-----------------
FALSE  |       n/a       |       n/a       | defed @ windef.h|       n/a
       |                 |                 | 32 bits size    |
       |                 |                 | equals 0        |
-------------------------------------------------------------------------------

Important notes:
- MSVC fails to conform to ISO C by not defining _Bool and not providing
  stdbool.h
- bool, true, false sizes are different in MSVC and GCC
Re: BOOL или bool?
От: Аноним  
Дата: 18.06.02 19:57
Оценка:
Здравствуйте Olearda, Вы писали:

O>Какая разница между bool и BOOL

Изначально в С не было булевой переменной как типа. BOOL — попытка этот пробел возместить. На самом деле BOOL определен через int (а может, и short), занимает 4(2) байта.
'bool' — это уже тип языка С, является ключевым словом, занимает 1 байт.
В общем отличие в том, что BOOL — тип искусственный, а bool — 'натуральная' часть языка.
Re[3]: BOOL или bool?
От: Андрей Тарасевич Беларусь  
Дата: 18.06.02 20:12
Оценка:
Здравствуйте qwe98765, Вы писали:

Q>Сорри, запоганилась таблица. Надо было пользоваться предпросмотром, кривые мои ручки... Попробую через кляузу...



Q>
Q>-------------------------------------------------------------------------------
Q>              ISO C            ISO C++            MSVC              GCC
Q>-------------------------------------------------------------------------------
Q>bool   | defined as alias| generic integral| 8 bits size     | 32 bits size
Q>       | to _Bool type in| type            |                 |
Q>       | stdbool.h       |                 |                 |
Q>-------|-----------------|-----------------|-----------------|-----------------
Q>BOOL   |       n/a       |       n/a       | typedefed as int|       n/a
Q>       |                 |                 | in windef.h     |
Q>       |                 |                 | (non-console)   |
Q>       |                 |                 | 32 bits size    |
Q>-------|-----------------|-----------------|-----------------|-----------------
Q>_Bool  | generic type,   |       n/a       |       n/a       | conforms to ISO,
Q>       | corresponds to  |                 |                 | 32 bits size
Q>       | unsigned int    |                 |                 |
Q>-------|-----------------|-----------------|-----------------|-----------------
Q>true   | defined as 1 in | generic literal | 8 bits size     | 32 bits size
Q>       | stdbool.h       | of type bool    | equals 1        | equals 1
Q>-------|-----------------|-----------------|-----------------|-----------------
Q>false  | defined as 0 in | generic literal | 8 bits size     | 32 bits size
Q>       | stdbool.h       | of type bool    | equals 0        | equals 0
Q>-------|-----------------|-----------------|-----------------|-----------------
Q>TRUE   |       n/a       |       n/a       | defed @ windef.h|       n/a
Q>       |                 |                 | 32 bits size    |
Q>       |                 |                 | equals 1        |
Q>-------|-----------------|-----------------|-----------------|-----------------
Q>FALSE  |       n/a       |       n/a       | defed @ windef.h|       n/a
Q>       |                 |                 | 32 bits size    |
Q>       |                 |                 | equals 0        |
Q>-------------------------------------------------------------------------------

Q>Important notes:
Q>- MSVC fails to conform to ISO C by not defining _Bool and not providing
Q>  stdbool.h
Q>- bool, true, false sizes are different in MSVC and GCC

Q>


Во-превых, я не понимаю, почему в одной таблице смешаны ISO C/C++ и MSVC/GCC. ISO C/C++ — спецификации языков программирования, а MSVC и GCC — компиляторы этих языков, которые могут работать как в режиме С, так и в режиме С++ (а GCC еще имеет режим C99). В каждом из режимов приведенные слева идентификаторы могут обозначать совершенно разные вещи. Например, у тебя в таблице написано, что в GCC размер типа 'bool' равен 32 бита. Я не знаю, верно ли это для режима C99 компилятора GCC, но при компиляции GCC в режиме С++ тип 'bool' имеет размер 8 бит, точно также как и в MSVC. Добавлю также, что по этой причине второе примечание совершенно бессмысленно (не "неверно", а именно бессмысленно).

Во-вторых, я не понимаю, зачем пихать BOOL, TRUE и FALSE в эту таблицу. Это чисто WinAPI-шные макросы, не имеющие вообще никакого отношения ни к спецификациям языков, ни к компиляторам языков. При этом в столбце GCC стоит 'n/a'. Почему? Возми библиотеку поддержки WinAPI для GCC и там ты найдешь те же самые BOOL, TRUE и FALSE с теми же самыми характеристиками.

В-третьих, первое примечание тоже странновато. Наличие типа '_Bool' и заголовочного файла 'stdbool.h' требуется только в компиляторе С99. Ни в С++, ни в С90 никакого типа '_Bool' нет и быть не должно. MSVC не является компилятором С99, поэтому отсутсвие там этого типа и этого заголовочного файла ничем из ряда вон выходящим не является. (Надо заметить, что выход стандарта С99 никак не отменяет стандарт С90.)
Best regards,
Андрей Тарасевич
Re[4]: BOOL или bool?
От: qwe98765  
Дата: 18.06.02 21:17
Оценка:
Здравствуйте Андрей Тарасевич, Вы писали:

АТ>Здравствуйте qwe98765, Вы писали:



АТ>Во-превых, я не понимаю, почему в одной таблице смешаны ISO C/C++ и MSVC/GCC. ISO C/C++ — спецификации языков программирования, а MSVC и GCC — компиляторы этих языков, которые могут работать как в режиме С, так и в режиме С++ (а GCC еще имеет режим C99). В каждом из режимов приведенные слева идентификаторы могут обозначать совершенно разные вещи. Например, у тебя в таблице написано, что в GCC размер типа 'bool' равен 32 бита. Я не знаю, верно ли это для режима C99 компилятора GCC, но при компиляции GCC в режиме С++ тип 'bool' имеет размер 8 бит, точно также как и в MSVC. Добавлю также, что по этой причине второе примечание совершенно бессмысленно (не "неверно", а именно бессмысленно).


Моя ошибка — нужно было сделать гораздо больше колонок — в частности колонку ISO C разбить на две — C90 и C99, а также вместо GCC сделать три колонки — GCC C, GCC C++ и GCC C99, а также MSVC разбить на четыре колонки — MSVC 6 C, MSVC 6 C++, MSVC 7 C и MSVC 7 C++. Постараюсь пофиксить. Более того, нужно было указать, какие версии стандартов имеются ввиду (относится к ISO 14822 /C++/, так как C90 и C99 говорят сами за себя). Более того, на очереди стоит еще и Бормановский Билдер, но руки пока не дошли.


АТ>Во-вторых, я не понимаю, зачем пихать BOOL, TRUE и FALSE в эту таблицу. Это чисто WinAPI-шные макросы, не имеющие вообще никакого отношения ни к спецификациям языков, ни к компиляторам языков. При этом в столбце GCC стоит 'n/a'. Почему? Возми библиотеку поддержки WinAPI для GCC и там ты найдешь те же самые BOOL, TRUE и FALSE с теми же самыми характеристиками.


Абсолютно согласен, но я пихал все, что относится к булевским типам и константам, чтобы привести ситуацию к некоему общему знаменателю (в целях выяснения, что переносимо, а что нет). Этой таблицей я всего лишь хотел показать, на что и где можно рассчитывать. По этой же причине в таблице смешаны стандарты и реализации — потому что если бы выяснилось, что в двух реализациях есть два совместимых решения, то предпочесть стоило бы то, которое одновременно присутствует и в стандарте.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.