[MSVC] ODR - как заставить соблюдать?
Проблема, имхо, решается только изменением хедера. Не думаю, что линкер в состоянии вытащить из либы полное описание класса. Но даже если в состоянии, то он не будет этого делать, потому что изменение способов доступа к полям класса не в его компетенции.
Не думаю, что линкер в состоянии вытащить из либы полное описание класса. Но даже если в состоянии, то он не будет этого делать, потому что изменение способов доступа к полям класса не в его компетенции.
Все-таки, я думаю, он может найти некоторые несоответствия. Хотя - хз. Не знаю, как у других линкеров с этим.
Какую-то часть информации о классе линкер пихает в его имя. Если различия это не затрагивают, то линкер ругаться не будет, поскольку он в принципе не способен увидеть эти различия. Откуда ему знать, например, что в 16-19 байтах класса хранится целое число? На всякие там приватности, друзей и т. п. он тоже не обратит внимания.
Ну, скажем, где-то генерится конструктор, его код зависит от списка членов класса в частности. В моем случае - это был разный список, значит, должны были генериться разные конструкторы, и на это компоновщик должен был ругаться. ИМХО.
Набор параметров у конструкторов одинаковый? Остальное линкер ниибёт.
Набор параметров у конструкторов одинаковый?Если конструкторы инлайновые, то и это не важно.
Блин, как все запущено...
Оставить комментарий
erotic
Я уже просто в ауте - целый день искал, почему долбанная программа вылетает - и что же выясняется:использовалась либа и хедер к ней, при чем в хедере определялся класс не так, как он был определен при компилировании либы. Но дело касалось только приватных членов, т.ч. интерфейс остался тот же. В итоге долбанная программа собиралась и работала, но при уничтожении объекта этого класса вылетала с ошибкой памяти. Линкер ничего не говорил
Можно настроить линкер соблюдать ODR?