BFE>За последний месяц меня 4 раза звали искать ошибку в чужом коде (я работаю консультантом). Так вот: дважды это было нарушение ODR при подключении новых библиотек; в первом случае пересечение по имени структуры (две разные структуры в двух разных библиотеках с совпадающими именами), во втором — совпадение по имени define с разными значениями для размера массива внутри структуры.
Разве компилятор не ругается когда встречает отпределение структуры которая уже определена ? То же самое и с define должно быть.
Здравствуйте, maks1180, Вы писали:
M>Разве компилятор не ругается когда встречает определение структуры которая уже определена ? То же самое и с define должно быть.
Обычно, нарушение ODR бывает, когда в разных единицах трансляции одноименные вещи чем-то отличаются.
Потом линковщик выбирает одну из реализаций и для объектников, которым не повезло, используется несоответствующее определение.
Например, структура или массив не того размера.
С т.з. компилятора для каждой единицы трансляции видно одно определение и это не ошибка.
Также и макросами, для них более того и переопределение не запрещено.
Если перед переопределением делать #undef, то и предупреждения не будет.
Здравствуйте, Igore, Вы писали:
W>>>Короче говоря: хотите, чтоб люди пользовались, делайте как общепринято, а не как вы считаете нужным. M>>Не соглашусь. QT по своему называют, например quint32 и люди пользуются — не плюются от этого. I>Тебе уже написали откуда это всё взялось, на новом Qt6 они наоборот расширили интерфейсы чтобы работать со стандартными контейнерами и типами, а QMap, qint остались для совместимости.
В пятом Qt по-моему любой класс можно использовать вместо STL класса. Это вроде ещё с 4ой версии началось, но не уверен. В Qt5 я вот только одного не пойму — QString практически полностью совместим по интерфейсу с std::striing, но, сцуко, у QString нет метода empty(), только isEmpty(). Повбывав бы
Здравствуйте, maks1180, Вы писали:
M>Разве компилятор не ругается когда встречает отпределение структуры которая уже определена ? То же самое и с define должно быть.
Ругается, но если два файла .cpp скомпилированы с разными заголовками, т.е. подключают разные .h, то совпадение по именам в этих .h файлах приводят к тому, что в .obj (.o, .lib) будут лежать определения с одинаковыми именами, но разными значениями/определениями. Компоновщик при линковке выбирает только одно значение/определение, а второе отбрасывает, что приводит к UB, которое иногда приводит к краху при исполнении.