firstvald 22 24 октября, 2023 Опубликовано 24 октября, 2023 · Жалоба ++ гораздо жещще проверяет соответствие типов аргументов. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 215 24 октября, 2023 Опубликовано 24 октября, 2023 · Жалоба 2 часа назад, repstosw сказал: А меня нервирует, что C++ не любит void main(void). Это ваш компилятор "не любит". А не си++. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 160 24 октября, 2023 Опубликовано 24 октября, 2023 · Жалоба 5 часов назад, repstosw сказал: Я по всей строгости - пишу void, если нет параметров. Но коллеги не согласны с моим решением - оставляют пустые скобки. Это принципиально - для C, а для C++ ? Это значит, что Вы пишете на Си, а коллеги - на C++. Для Вас писать принципиально, для коллег - нет. В Си отсутствие скобок в (по крайней мере старых) стандартах подразумевало немного другое, а именно - возможность принимать заранее неизвестное кол-во аргументов неизвестного типа. В C++ func() равносильно func(void), поэтому для снижения ряби в глазах void не пишут. Поэтому разница между Си и C++ в этом случае - огромная. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_pv 60 24 октября, 2023 Опубликовано 24 октября, 2023 · Жалоба 8 hours ago, repstosw said: А меня нервирует, что C++ не любит void main(void). пишет, что main() должен возвращать int. У меня программа постоянно в main() в вечном цикле. Даже освобождение ресурсов не нужно, так как программа работает вечно, пока питание не закончится. в плюсах есть перегрузка функций с name mangling, и там void main() и int main() в результате имеют разные имена. соответственно из стартап кода на ассемблере нельзя просто сказать call main, наплевав на его тип. 9 hours ago, repstosw said: Тут ещё споры разгорелись, по поводу того, если функция не имеет аргументов - надо ли void писать в скобках или нет. Я по всей строгости - пишу void, если нет параметров. Но коллеги не согласны с моим решением - оставляют пустые скобки. Это принципиально - для C, а для C++ ? если правильно помню, принципиально это было только для С89, если не раньше.. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
EdgeAligned 70 24 октября, 2023 Опубликовано 24 октября, 2023 · Жалоба Хех, я думал, вы до сих пор ещё память ровняете, а вы уже за ни в чем неповинный void уцепились 🙂 Выход из main() возможен, и более того, после него есть "загробная жизнь", так сказать, там ведь есть продолжение в стартапе. Обычно, из main() выход будет по ошибке, а возвращаемое значение - код ошибки. В "большом" программировании (для компов) возвращаемое значение по завершению работы программы говорит о результатах завершения: 0 - всё в порядке, иные значения - какие-то косяки. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_3m 6 24 октября, 2023 Опубликовано 24 октября, 2023 · Жалоба 3 часа назад, EdgeAligned сказал: Выход из main() возможен, и более того, после него есть "загробная жизнь", так сказать, там ведь есть продолжение в стартапе. Вот вам стартап, покажите мне "загобную жизнь" после bl main .section .text.Reset_Handler .weak Reset_Handler .type Reset_Handler, %function Reset_Handler: ldr sp, =_estack /* set stack pointer */ /* Copy the data segment initializers from flash to SRAM */ ldr r0, =_sdata ldr r1, =_edata ldr r2, =_sidata movs r3, #0 b LoopCopyDataInit CopyDataInit: ldr r4, [r2, r3] str r4, [r0, r3] adds r3, r3, #4 LoopCopyDataInit: adds r4, r0, r3 cmp r4, r1 bcc CopyDataInit /* Zero fill the bss segment. */ ldr r2, =_sbss ldr r4, =_ebss movs r3, #0 b LoopFillZerobss FillZerobss: str r3, [r2] adds r2, r2, #4 LoopFillZerobss: cmp r2, r4 bcc FillZerobss /* Call the clock system initialization function.*/ bl SystemInit /* Call static constructors */ bl __libc_init_array /* Call the application's entry point.*/ bl main bx lr .size Reset_Handler, .-Reset_Handler Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 160 24 октября, 2023 Опубликовано 24 октября, 2023 · Жалоба 35 минут назад, _3m сказал: Вот вам стартап, покажите мне "загобную жизнь" после bl main Так нечестно)) Не проще ли отдать всю работу по подготовке runtime Си - компилятору? Самодельными предстартапами main() Вы несколько сужаете потенциальные возможности компилятора. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
EdgeAligned 70 24 октября, 2023 Опубликовано 24 октября, 2023 · Жалоба Предпоследняя строчка - загробная жизнь после смерти программы. Вообще, без разницы, на каком языке написан стартап. И без разницы, есть ли там загробная жизнь или нет. Это в некоторой мере условность, но ничто не запрещает. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
EdgeAligned 70 24 октября, 2023 Опубликовано 24 октября, 2023 (изменено) · Жалоба Про int main(void) - насколько я знаю, в стандарте прописано именно возвращаемое значение int. А касательно пустого аргумента функций, то в Си обязательно писать (void), иначе будет подразумеваться неявно тип int. В С++ наоборот, пустые скобки неявно означают void, но за отсутствие явного указания void компилятор не ругается. Всё ведь очень просто. Более того, аргумент в main() может принимать либо void, либо два аргумента типа int и char**. Это тоже прописано в стандарте. Ну и для C обязательно писать void, для С++ - не обязательно. Изменено 24 октября, 2023 пользователем EdgeAligned Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 215 24 октября, 2023 Опубликовано 24 октября, 2023 · Жалоба 1 час назад, _3m сказал: Вот вам стартап, покажите мне "загобную жизнь" после bl main bl main bx lr .size Reset_Handler, .-Reset_Handler Странный какой-то стартап. С таким после main() не то что загробная жизнь, а и HardFault возможен. Или что угодно. Вы где такое откопали? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_3m 6 24 октября, 2023 Опубликовано 24 октября, 2023 · Жалоба 15 минут назад, jcxz сказал: Странный какой-то стартап. С таким после main() не то что загробная жизнь, а и HardFault возможен. Или что угодно. Вы где такое откопали? STM32CubeIDE. Интересно где вы HardFault нашли ? Там все прямо как грабли 🙂 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 160 24 октября, 2023 Опубликовано 24 октября, 2023 · Жалоба 30 минут назад, EdgeAligned сказал: А касательно пустого аргумента функций, то в Си обязательно писать (void), иначе будет подразумеваться неявно тип int. Да не будет ничего подразумеваться. Вы путаете это со случаем, когда в месте вызова компилятору неизвестен прототип функции. 3 минуты назад, _3m сказал: STM32CubeIDE. Интересно где вы HardFault нашли ? Там все прямо как грабли 🙂 Толстый намек на то, что после bx lr - мусор. А пользовались бы стандартным компиляторным вызовом __main(), библиотека вызвала бы __exit(), которая по-умолчанию была бы зациклена Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 215 24 октября, 2023 Опубликовано 24 октября, 2023 · Жалоба 15 минут назад, _3m сказал: STM32CubeIDE. Интересно где вы HardFault нашли ? Там все прямо как грабли 🙂 HF будет после перехода BX LR по случайному адресу. Так как функция не обязана сохранять значение LR, значит в общем случае на выходе main() в LR - мусор. И BX LR отправит программу по неизвестному адресу, с большой вероятностью в HF. Не знаю - может конечно Куб сохраняет LR? Надо его соглашения вызова смотреть. Вроде как не обязан. Или посмотреть листинг любой функции, использующей LR. Я кубом не пользуюсь - посмотреть не могу. Если у него какие-то свои соглашения вызова, тогда будут проблемы с совместимостью с obj-файлами, созданными другими компиляторами. 15 минут назад, Arlleex сказал: Толстый намек на то, что после bx lr - мусор. Не "после BX LR", а уже перед ней. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
EdgeAligned 70 24 октября, 2023 Опубликовано 24 октября, 2023 · Жалоба Показываю наглядно содержимое линк-регистра при выполнении bx lr: переход будет осуществлен по указанному в lr адресу, а далее ситуация усугубляется, и поскольку lr будет содержать недопустимый адрес, произойдет HF Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
x893 45 24 октября, 2023 Опубликовано 24 октября, 2023 · Жалоба 23 minutes ago, jcxz said: Не знаю - может конечно Куб сохраняет LR? Надо его соглашения вызова смотреть. Куб то тут при чём ? А из-за чего весь сыр-бор идёт ? Изначально было про выравнивание вроде. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться