Ключевые слова C ++ «истина» и «ложь» в Visual C ++ 6.0 неожиданно становятся неверными или ложными - PullRequest
5 голосов
/ 04 февраля 2009

Мой компилятор (VC ++ 6.0 sp6) явно сошел с ума. В некоторых частях кода я вижу, что 'bool mybool = true;' обнуляется и присваивает false, и наоборот для true. Изменение истинных / ложных ключевых слов на 1/0 делает его работоспособным. Тот же самый код прекрасно компилируется в другом месте без изменения ключевых слов true / false.

Что может быть причиной этого? Моей первой мыслью было повреждение памяти или ОЗУ, но все было хорошо. Я недалек от того, чтобы переформатировать свой диск и переустановить все, но я в ужасе, я все еще вижу то же самое плохое поведение.

Возможно ли технически для макроса или связанной библиотеки где-то испортить значение 'true' и 'false'?

UPDATE: Тайна разгадана. Флаг переменной среды на моем компьютере был установлен в «ложь», и способ, которым это было интерполировано некоторым кодом препроцессора, переопределил ключевое слово.

Ответы [ 10 ]

13 голосов
/ 04 февраля 2009

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

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

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

Найдите файл без заголовка, в котором вы видите это поведение, желательно с несколькими включениями.

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

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

5 голосов
/ 04 февраля 2009

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

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

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

5 голосов
/ 04 февраля 2009

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

4 голосов
/ 04 февраля 2009

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

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

3 голосов
/ 04 февраля 2009

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

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

3 голосов
/ 04 февраля 2009

Скорее всего, заголовочный файл переворачивает значения с помощью макроса - хотя почему-то я не могу рискнуть догадаться. Есть ли вероятность того, что файл будет скомпилирован как C, а другие как C ++, и где-то есть некоторый # ifdef / # код, который пытается «исправить» значения true / false, но получил их неправильно?

1 голос
/ 04 февраля 2009

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

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

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

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

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

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

1 голос
/ 04 февраля 2009

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

Возможно, кто-то развлекается с вами?

0 голосов
/ 04 февраля 2009

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

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

0 голосов
/ 04 февраля 2009

Проверка для #define true 0 и #define false 1

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...