Тестовый пример, приведенный ниже, построен в Visual Studio 6.0.
Поведение Visual Studio6.0 по умолчанию - «База данных программы с редактированием и продолжением». Оказывается, это позволяет STRING POOLING. Таким образом, компилятор просматривает и оптимизирует ВСЕ строки времени компиляции в пул, а дублирующиеся строки удаляются. Таким образом, все буквальные определения «none» и «N / A» ниже будут указывать на один и тот же физический адрес. В результате сравнение строк, кажется, работает.
Любые динамически созданные строки не будут совпадать, так как их адреса всегда будут уникальными.
Чтобы получить этот тестовый пример для сбоя, создайте его с помощью «Программной базы данных» в VS 6.0 (см. Скриншот ниже).
//
// Slight changes to my program from what I compiled
#include "stdio.h"
#define IS_NONE( a_key ) ( ( a_key == "none" || a_key == "N/A" ) ? TRUE : FALSE )
HOST_BEGIN_BLOCK( TestCase ) {
char *psNameNone = "none";
char *psNameNA = "N/A";
char *psNameCAT = "CAT";
if (IS_NONE(psNameNone) ) {
printf("psNameNone Matches NONE\n");
printf("%s psNameNoneAddr 0x%x \"none\" addr 0x%X\n",
psNameNone,psNameNone,
"none");
} else {
printf("psNameNone Does Not Match None\n");
printf("%s psNameNoneAddr 0x%x \"none\" addr 0x%X\n",
psNameNone,psNameNone,
"none");
}
if (IS_NONE(psNameNA) ) {
printf("psNameNA Matches N/A\n");
printf("%s psNameNA 0x%x \"N/A\" addr 0x%X\n",
psNameNA,psNameNA,
"N/A");
} else {
printf("psNameNone Does Not Match N/A\n");
printf("%s psNameNA 0x%x \"N/A\" addr 0x%X\n",
psNameNA,psNameNA,
"N/A");
}
if (IS_NONE(psNameCAT)) {
printf("psNameNA Matches CAT\n");
printf("%s psNameNA 0x%x \"CAT\" addr 0x%X\n",
psNameNone,psNameNone,
"CAT");
} else {
printf("psNameNA does not match CAT\n");
printf("%s psNameNA 0x%x \"CAT\" addr 0x%X\n",
psNameNone,psNameNone,
"CAT");
}
}
Ниже приведено изображение прохождения тестового примера. Обратите внимание, что все строки АДРЕСА одинаковы.
Построен с «Программная база данных с редактированием и продолжением»
Этот тестовый пример не пройден, как и следовало ожидать, если использовать неправильный синтаксис сравнения.
Построен с помощью «Базы данных программ».
Надеюсь, это поможет другим попытаться выяснить, почему порты компилятора VS6.0-> Modern работают на VS6.0 (компилятор 1998 года), но не работают с современным компилятором.