|
0 / 0 / 0
Регистрация: 04.06.2022
Сообщений: 24
|
||||||
Почему компилируется и выполняется такой код?04.06.2022, 13:59. Показов 636. Ответов 8
Метки нет (Все метки)
У объекта типа A, указатель которого приведён к типу B*, нет функции voidB, а он её почему-то вызывает.
Более того, сигнатуры voidA и voidB отличаются, но код всё равно компилируется и работает. Почему? Как вообще происходит вызов функций и передача ей аргументов, есть ли что-нибудь почитать про это? Я так понял, просто считываются байты на участках памяти и не важно, есть ли в них вообще какой-то смысл. Но почему это происходит? Почему даже шаблонный класс сккомпилировался, хотя ему недостаёт методов?
0
|
||||||
| 04.06.2022, 13:59 | |
|
Ответы с готовыми решениями:
8
Почему не компилируется код |
|
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
|
||
| 04.06.2022, 14:14 | ||
|
Работает он потому, что в нем нет существенного нарушения ABI. Как только оно появится, код работать не будет, или будет работать не так, как вы ожидаете. Это как раз к вопросу о том, что почитать. Например: https://itanium-cxx-abi.github.io/cxx-abi/abi.html https://uclibc.org/docs/psABI-x86_64.pdf
1
|
||
|
2256 / 1515 / 708
Регистрация: 17.03.2022
Сообщений: 4,868
|
||
| 04.06.2022, 14:16 | ||
Хотите иметь надежный контроль типов - пишите на чем-нибудь другом. А тут такие штуки, хотя и формально запрещены стандартом, никак не контролируются (правда, и результат формально непредсказуем).
1
|
||
|
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
|
||
| 04.06.2022, 14:18 | ||
|
Читайте про инстанцирование шаблонов классов. Например здесь: https://en.cppreference.com/w/... s_template Если коротко: то, что не используется - не инстанцируется. В вашем коде метод voidC() у шаблона не вызывается, значит не инстанцируется. Как только вы добавите его вызов в код, сразу же получите ошибку компиляции.
0
|
||
|
Вездепух
12930 / 6798 / 1820
Регистрация: 18.10.2014
Сообщений: 17,205
|
|||
| 04.06.2022, 14:31 | |||
|
Ваш код "компилируется" или "работает" по чистой случайности. Компилятор не может отловить всех ошибок. За чем-то вам придется следить самостоятельно. К С++ компилируемость или работоспособность вашего кода не имеет никакого отношения.
0
|
|||
|
0 / 0 / 0
Регистрация: 04.06.2022
Сообщений: 24
|
||||
| 04.06.2022, 14:55 [ТС] | ||||
|
Спасибо тем, кто ответил, стало понятнее.
Добавлено через 2 минуты Добавлено через 2 минуты Получается, в таких манипуляциях с указателями и вызовами функций вообще почти любые методы с любыми аргументами можно вызывать, главное, чтобы программа не грохнулась. Просто считывание байтов и воздействие на них?
0
|
||||
|
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
|
|
| 04.06.2022, 14:57 | |
|
cdcodecpp, если вы знаете как устроена конкретная реализация, да, можно.
0
|
|
|
2256 / 1515 / 708
Регистрация: 17.03.2022
Сообщений: 4,868
|
|||
| 04.06.2022, 15:02 | |||
|
Добавлено через 3 минуты
0
|
|||
|
Вездепух
12930 / 6798 / 1820
Регистрация: 18.10.2014
Сообщений: 17,205
|
||
| 04.06.2022, 15:08 | ||
|
Ваш код имеет неопределенное поведение. Это значит, что в нем нет никаких "вызовов", никаких "аргументов", никаких "байтов" и никаких "воздействий на них". Компилятор может делать с эти кодом все, что угодно. Он может выкинуть ваш неопределенный код вообще целиком, как будто его и не было, а может странслировать его в что-то внешне не имеющее никакого отношения к написанному. Эквивалентным определением неопределенного поведения является следующее: компилятор имеет право транслировать код в предположении, что неопределенное поведение никогда не происходит, то есть обстоятельства, приводящие к неопределенному поведению никогда не возникают. В вашем примере у класса A нет метода voidB, а это значит что вызова такого метода через указатель на A не может быть потому что не может быть никогда. Компилятор будет использовать такие соображения при трансляции кода.В частности, ваша программа не содержит ветвлений и все пути выполнения ведут к неопределенному поведению. Это означает, что компилятор имеет право полагать, что эта программа никогда не будет запущена на выполнение. И, соответственно, странслировать ее в пустой код.
1
|
||
| 04.06.2022, 15:08 | |
|
Помогаю со студенческими работами здесь
9
О специализации шаблона: почему код компилируется? Как работает данный код? И почему не компилируется? Почему указанный код не компилируется в Visual Studio?
Почему не компилируется код с закрытым сконструированным компаратором? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/
O1rJuneU_ls
https:/ / vkvideo. ru/ video-115721503_456239114
|
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ВВЕДЕНИЕ
Введу сокращения:
аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
|
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi
ветка по-частям.
коммит Create переделка под биомассу. txt
вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
|
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ *
Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях.
Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её.
Последовательность действий:. . .
|
|
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
|
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение.
И на уровне агентов добавится между грибами или бактериями взаимодействий.
До того я пробовал подход через многомерные массивы,. . .
|
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Налог на собак: https:/ / **********/ gallery/ V06K53e
Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf
Пост отсюда. . .
|
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop?
Ниже её машинный перевод.
После долгих разбирательств я наконец-то вернула себе. . .
|