C++ 'истинные' и 'ложные' ключевые слова внезапно не TRUE или FALSE в Visual C++ 6.0

Мне нравится доморощенный.

https://brew.sh

Например. На Cli Brew установите php@7.2 или php@7.1 и т. Д. Я также часто использую Docker для Mac для запуска контейнеров с PHP.

Очень удобно: вы можете легко переключать версии PHP с помощью скрипта brew php switcher. Найдите его, используя brew search php :-).

5
задан kingkongrevenge 4 February 2009 в 21:44
поделиться

10 ответов

Макрос препроцессора мог, конечно, сделать это, хотя это будет довольно удивительно. Один способ проверить, если это так, был бы

#ifdef true
#  error "true is defined as a macro"
#endif
#ifdef false
#  error "false is defined as a macro"
#endif

Ответ на комментарии:

Найдите незаголовочный файл, где Вы видите это поведение, предпочтительно один с немногими #includes.

Посреди списка включает, поместите #ifdef #error директивы.

если ошибка смещается, Вы знаете, что это находится в первой половине, включает, если это не делает это находится во второй половине. Разделите половину в половине и повторении. Когда Вы сужаете его к одному заголовку, открытому тот заголовок. Если тот заголовок включает какое-либо повторение заголовков процесс для списка заголовков, это включает. В конечном счете необходимо смочь найти #defines. Утомительный, я соглашаюсь.

13
ответ дан 18 December 2019 в 05:29
поделиться

Переполнение буфера и пишущий в неинициализированную память может также составлять такое поведение. Например, если Вы имеете массив и bool, выделенный в смежных ячейках памяти, и случайно пишете вне границ измерения массива.

5
ответ дан 18 December 2019 в 05:29
поделиться

Если Вы видите эту проблему при проверке значений переменных в отладчик, и Вы выполняете сборку конечных версий, это мог просто быть артефакт системы отладки. Самый легкий способ проверить это состоял бы в том, чтобы добавить некоторый код вроде:

if (mybool)
    printf("mybool is true\n");
else
    printf("mybool is false\n");

Вы сможете быстро определить, точен ли отладчик или нет.

5
ответ дан 18 December 2019 в 05:29
поделиться

Скорее всего, заголовочный файл зеркально отражает значения через макрос - хотя, почему я не мог рисковать предположением. Шанс, что файл компилируется как C и другие как C++ и существует некоторый код #ifdef/#define где-нибудь, который пытается 'зафиксировать' истинные/ложные значения, но понял их превратно?

3
ответ дан 18 December 2019 в 05:29
поделиться

Во-первых, VC6 является древним и ошибочным. Существуют случаи, где это просто генерирует неправильный код, который мог быть решением Вашей проблемы. Не используйте VC6, если у Вас есть выбор.

Во-вторых, то, что Вы видите, наиболее вероятно просто результат оптимизации. Ваш код ведет себя правильно? Если так, просто, что отладчик запутывается, потому что код выполнен, отличается (из-за оптимизации), чем исходный код.

4
ответ дан 18 December 2019 в 05:29
поделиться

Я неопределенно вспоминаю, что с VC6 Вы могли выполнить препроцессор совершенно отдельно и видеть его вывод. Это может быть переключатель компилятора.

В любом случае это - почти наверняка результат спутанного #defines. Если бы это была перезапись памяти, как был предложен, Вы, вероятно, видели бы другие одинаково причудливые поведения.

3
ответ дан 18 December 2019 в 05:29
поделиться

Технически возможно переопределить bool, но я не вижу, почему Ваша конкретная среда была бы единственной, где эта проблема появляется.

Возможно, у кого-то есть некоторая забава с Вами?

1
ответ дан 18 December 2019 в 05:29
поделиться

Проблемы как это страшны, потому что у Вас действительно нет места для запуска.

Первый тест, который я сделал бы, должен искать весь исходный код для Вашего проекта для вещей, который соответствует и "#define" и "верный", или "#define" и "лжи". Если у Вас есть кто-то вокруг, кто знает Perl, который должен быть быстрым сценарием.

Вы зависите от соединения против некоторых внешних библиотек, которые, возможно, изменились? Если Вы подозреваете некоторую странность с чем-то, против чего Вы связываетесь, Вы могли попробовать, следующие шаги:

  • Сделайте программу, которая проверяет значение истинных/ложных.
  • Скомпилируйте эту программу, удостоверившись связывать эту программу против всех библиотек что Ваш исходный код.
  • Запустите свою программу и посмотрите, показывает ли Ваша минимальная программа истинную/ложную ошибку, которая влияет на Вашу проблему.

Если та минимальная программа имеет ошибку, Вы изолировали проблему вниз к чему-то, что Вы делаете с соединением. Следующий очевидный тест после этого должен связать программу против только стандартных библиотек C++, чтобы протестировать, если Ваш компилятор так или иначе виновным.

Наконец, прежде, чем переформатировать Вашу машину сделали, чтобы кто-то еще скомпилировал Ваш код. Это действительно легко, и если бы сценарий Perl не поднял ничего, что я определенно попросил бы у коллеги некоторой справки.

1
ответ дан 18 December 2019 в 05:29
поделиться

Проверьте на #define true 0 и #define false 1

0
ответ дан 18 December 2019 в 05:29
поделиться

Даже в Visual Studio 2003 также иногда это происходит со мной. Но я не знаю точной причины для этого. Это происходит при проверке возвращаемого значения функции. Даже при том, что я возвращаю true от функции, в то время как присвоение возвращаемого значения в вызывании функции, верной, становится преобразованным в ложь и ложь к истинному.

В этом случае я действительно проверяю на некоторый другой выходной параметр.

0
ответ дан 18 December 2019 в 05:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: