Если вы включили windows.h
, то FALSE
определяется как 0. TRUE
определяется как 1. Это не логический тип, это целочисленный тип. Windows также определила тип BOOL
, который на самом деле является целочисленным типом, предназначенным для размещения значений TRUE
и FALSE
.
Соответствующие разделы кода в windows.h
выглядят примерно так:
#ifdef FALSE
#undef FALSE
#endif
#define FALSE 0
#ifdef TRUE
#undef TRUE
#endif
#define TRUE 1
typedef int BOOL, *PBOOL, *LPBOOL;
Windows изначально была написана на C, как и все оригинальные приложения Windows. В то время в C не было булева типа, определенного стандартом. Вместо этого разработчики были вынуждены определять свои собственные логические константы. Чтобы предотвратить возможную путаницу, Microsoft выбрала стандарт, который будет использоваться для всех приложений Windows.
Если вы пишете приложения для Windows, вам все равно может понадобиться использовать идентификаторы TRUE
и FALSE
. Некоторые из функций, определенных в windows.h
, принимают булевы параметры (на самом деле целые числа!), Типизированные как BOOL
, или возвращают значения такого типа. C ++, будучи строго типизированным, может жаловаться, если вы приведете их к булевому типу, определенному в стандарте языка. Для согласованности я использую старые идентификаторы во всех своих вызовах функций Windows API, а теперь ключевые слова true
и false
определены стандартом во всех методах, которые я пишу сам.
На самом деле нет причин не использовать FALSE
, как это определено в windows.h
. Но вы не должны определять его самостоятельно в проприетарном заголовочном файле, как уже упоминали другие, потому что нет гарантии, что определение останется неизменным со временем. Это может привести к некоторым довольно глупым ошибкам, тип которых может появиться в Daily WTF.
Ответ Мата является на 100% правильным, что ни TRUE
, ни FALSE
не определены стандартами C или C ++. Однако они строго определены API Windows и гарантированно не изменятся. Их использование не приведет к созданию действительно кроссплатформенного, строго совместимого со стандартами кода C ++, но это редко вызывает озабоченность при написании приложений для Windows, поскольку ни одна из них не вызовет другие функции в windows.h
.