Здравствуйте Olearda, Вы писали:
O>Какая разница между bool и BOOL
Да просто это разные типы данных. BOOL (значения — TRUE и FALSE) из Windows, bool (значения true и false) — из C++. Хотя часто и взаимозаменяемые. Но ошибку можно потом искато долго.
И в памяти разное место требуют (см. sizeof()).
Здравствуйте 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 ввели, но мог и ослышаться).
Здравствуйте Olearda, Вы писали:
O>Какая разница между bool и BOOL
разница очень существенная, особенно когда используешь в DLL, т.к. bool-1 байт, а BOOL 4 байта
кроме того в windef.h есть такая строчка
Здравствуйте 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:
Ну подумаешь, чуть-чуть обложался :)
Здравствуйте SergH, Вы писали:
SH>Если не ошибаюсь, BOOL это typedef для DWORD или чего-то подобного, поэтому он может пренимать гораздо больше значений. В MSDN про многие функции написано, что они возвращают FALSE в случае провала и не-FALSE (а не TRUE) в случае успеха, хотя их возвращаемый тип определён как BOOL.
Здравствуйте 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
Здравствуйте AntonS, Вы писали:
AS>Здравствуйте Olearda, Вы писали:
O>>Какая разница между bool и BOOL AS>Принципиально не знаю, но пишут, что в Visual Studio принят BOOL, т.к. его использовали до официального принятия bool, видимо он там так и остался...
Ну да, ну да... В С++ логического типа изначально не было. Но в Win16 народу очень хотелось что-то такое иметь. Отсюда, вроде бы, появился BOOL. Потом народ наваял кучу кода для Win16, и при появлении Win32 встал вопрос, как при перемене разрядности программы там, где это можно, сделать так, чтоб все работало (понятно, что код, завязанный на размер типа в байтах, прийдется переписывать). Тогда все эти макросы и тайпдэфы и перекочевали в Win32-программирование в неизменном виде, где это было возможно. Так-что, надо говорить "в программировании под Win32...".
Я вот, например, переносимые на юниксы с помощью VS прграммы пишу, так что мне виндовые типы как-то ни к селу, ни к городу, хотя 99.8% времени я провожу в VS.
Kaa>Я вот, например, переносимые на юниксы с помощью VS прграммы пишу, так что мне виндовые типы как-то ни к селу, ни к городу, хотя 99.8% времени я провожу в VS.
Интересно, проверка на правильность в графической среде, а потом код, компилить в Unix ?
Здравствуйте SergH, Вы писали:
SH>Если не ошибаюсь, BOOL это typedef для DWORD или чего-то подобного, поэтому он может пренимать гораздо больше значений. В MSDN про многие функции написано, что они возвращают FALSE в случае провала и не-FALSE (а не TRUE) в случае успеха, хотя их возвращаемый тип определён как BOOL.
Мало того, DialogProc в windows должен возвращать BOOL и я видел по крайней мере одно сообщение, в описании которого говорится, что нужно возвращаемый DWORD скастить в BOOL и возвращать спокойно Вот вам и логический тип
Здравствуйте m.a.g., Вы писали:
...>Мало того, DialogProc в windows должен возвращать BOOL и я видел по крайней мере одно сообщение, в описании которого говорится, что нужно возвращаемый DWORD скастить в BOOL и возвращать спокойно Вот вам и логический тип
А что за сообщение, если не секрет? Обычно, когда диалогу нужно вернуть результат это делается через SetWindowLong(hDlg, DWL_MSGRESULT, value). Например, так wizard'ы реагируют на WM_NOTIFY + PSN_QUERYCANCEL.
Здравствуйте 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).
Здравствуйте 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
Если найдете здесь неточности, плз, напишите сюда, буду благодарен
Сорри, запоганилась таблица. Надо было пользоваться предпросмотром, кривые мои ручки... Попробую через кляузу...
-------------------------------------------------------------------------------
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 — 'натуральная' часть языка.
Здравствуйте 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.)
Здравствуйте Андрей Тарасевич, Вы писали:
АТ>Здравствуйте 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 с теми же самыми характеристиками.
Абсолютно согласен, но я пихал все, что относится к булевским типам и константам, чтобы привести ситуацию к некоему общему знаменателю (в целях выяснения, что переносимо, а что нет). Этой таблицей я всего лишь хотел показать, на что и где можно рассчитывать. По этой же причине в таблице смешаны стандарты и реализации — потому что если бы выяснилось, что в двух реализациях есть два совместимых решения, то предпочесть стоило бы то, которое одновременно присутствует и в стандарте.