Я нашел решение! Я установил обновление KB2932046 и KB2919355 и после перезагрузки попытался установить обновления онлайн! Это исправлено автоматически!
Мэтью Уилсон обсуждает BOOL
, bool
и аналогичные в разделе 13.4.2 Несовершенный C ++ . Смешивание этих двух может быть проблематичным, поскольку они обычно имеют разные размеры (и поэтому указатели и ссылки не являются взаимозаменяемыми), и поскольку у bool
не гарантированно будет какой-либо конкретный размер. Попытка использовать typedefs или условную компиляцию для сглаживания различий между BOOL
и bool
или попытка разрешить одному булевому типу работать как на C, так и на C ++ еще хуже:
#if defined(__cplusplus) || \
defined(bool) /* for C compilation with C99 bool (macro) */
typedef bool bool_t;
#else
typedef BOOL bool_t;
#endif /* __cplusplus */
Этот подход означает, что тип возвращаемого значения функции может отличаться в зависимости от того, какой язык его вызывает; Уилсон объясняет, что он видел больше, чем одну ошибку в своем собственном коде и других, что вытекает из этого. Он делает вывод:
Решением этого недостатка является, как это часто бывает, воздержание. Я никогда не используюbool
для чего-либо, что может быть доступно через несколько блоков ссылок - динамические / статические библиотеки, поставляемые объектные файлы - что в основном означает не в функциях или классах, которые появляются вне заголовочных файлов. Практический ответ, каким бы он ни был, заключается в использовании псевдобулева типа, размер которого равенint
.
Короче говоря, он согласился бы с вашим подходом.
Другая ситуация, в которой следует использовать BOOL
: при реализации функции обратного вызова, которая принимает или возвращает BOOL
.
Например, EnumWindows ()
получает указатель на функцию обратного вызова со следующей сигнатурой:
BOOL CALLBACK EnumWindowsProc(
HWND hwnd,
LPARAM lParam
);
Если для этого вы используете bool
, вам придется типизировать указатель вашей функции.
По-видимому, нет веских причин использовать BOOL
:
http://blogs.msdn.com/oldnewthing/archive/2008/03/25/8334558.aspx
http://blogs.msdn.com/oldnewthing/archive/2004/ 12/22 / 329884.aspx
Если BOOL - это какой-то интегральный тип, а он всегда есть, а BOOL определен так, что работает правильно, стандартные преобразования автоматически сделают это правильно. Вы не можете использовать их как взаимозаменяемые, но вы можете приблизиться.
Используйте BOOL в интерфейсе, где вам нужно взаимодействовать с Win32 API или чем-то еще. В остальном используйте bool.
Я думаю о "истинном"/"TRUE" и "ложном"/"FALSE" как о синтаксическом сахаре, решении проблемы, которой никогда не существовало. Я всегда думал, что проще использовать и читать "1" и "0".
Когда вы думаете о том, что флаги в регистрах включены или выключены, вы думаете в 1s и 0s или правда и фальшь? Что произойдет, если вы захотите сохранить несколько флагов в одной переменной? 1s и 0s универсальны.
Я думаю, что слово "ложь" слишком длинное для своего блага. Когда я вижу "0", оно выделяется у меня в голове, как красный стоп-знак. Знаки стоп - красные, потому что красный цвет привлекает внимание людей. Чтение слова "ложный" похоже на зеленый знак "стоп".
Итак, к черту шерсть и БУЛЬ. По умолчанию, я не знаю.
... но, на самом деле, правильное использование булевых флагов - это наименьшее беспокойство в языке, в котором столько же способов допустить ошибку, сколько и в C++.