Как говорили многие здесь, вы нарушили так называемое Правило Одного Определения (ODR).
Важно понимать, как собираются программы на C / C ++. То есть единицы перевода (файлы cpp) компилируются отдельно , без какой-либо связи друг с другом. Следующий компоновщик собирает исполняемый файл в соответствии с символами и частями кода, сгенерированными компилятором. У него нет высокоуровневой информации о типе, поэтому он не может (и не должен) обнаруживать проблему.
Так что вы на самом деле обманули компилятор, избили себя, стреляйте ногой, что хотите.
Одна вещь, которую я хотел бы упомянуть, это то, что на самом деле правило ODR нарушается очень часто из-за незначительных изменений в различных заголовочных файлах и разных определениях, но обычно проблем нет, и люди даже не осознают этого.
Например, структура может иметь член типа LPCTSTR
, который является указателем на char
или wchar_t
, в зависимости от определений, включений и т. Д. Но этот тип нарушения "почти нормальный" , Пока вы на самом деле не используете этот элемент в по-разному скомпилированных единицах перевода, проблем нет.
Есть также много других распространенных примеров. Некоторые возникают из-за реализованных в классе функций-членов (встроенных), которые фактически компилируются в разный код в разных единицах перевода (например, из-за разных опций компилятора для разных единиц перевода).
Однако обычно это нормально. В вашем случае, однако, структура памяти структуры изменилась. И тут у нас настоящая проблема.