main()函数执行前,做了什么?

本文解析了C/C++程序在main函数执行前的准备工作,重点介绍了_start()和_libc_start_main()函数的作用,包括设置运行环境、启动线程、初始化操作及注册清理函数,对初学者理解程序启动过程有极大帮助。

最近阅读了一本书《高级C/C++编程技术》,发现都是非常有用的知识,对于初学者提升能力是非常有帮助的,更容易理解编译过程,这儿讲解一下main函数执行之前做了哪些准备。

main()函数之前,会先执行一些函数,这些函数有什么作用呢?

既然在main()函数之前执行,那肯定是对程序的运行做准备。这个应该都能想到。

这儿用两个函数作简单讲解:

①_start()函数:主要目的是为接下来调用的_libc_start_main()函数准备入参。

②_libc_start_main()函数:

原型:

 int __libc_start_main(int (*main) (int, char * *, char * *), /* address of main function */
                                       int argc, /* number of command line args */
                                       char * * ubp_av, /* command line arg array */
                                       void (*init) (void), /* address of init function */
                                       void (*fini) (void), /* address of fini function */
                                       void (*rtld_fini) (void), /* address of dynamic linker fini function */
                                       void (* stack_end) /* end of the stack address */
);

从①知道_start()函数是准备参数,然后在调用此函数,那么_libc_start_main()函数会做哪些动作呢?

a.为程序设置好运行环境;

b.启动程序的线程;

c.调用_init()函数,做一些必要的初始化操作,gcc编译器利用_attribute_(constructor)关键字对程序启动前的自定义操作提供支持;

d,注册_fini() 和 rtld_fini()函数,程序终止时调用。

 

执行_libc_start_main()函数完成后,就开始调用main(),启动程序。

希望能对一些初学者有所帮助。加油!

嵌入式系统中,`main` 函数在进入 `while` 循环之会被完整执行。具体而言,程序从 `Reset_Handler` 开始运行,经过系统初始化后跳转到 `main` 函数,并按照顺序执行其中的代码,直到遇到 `while` 循环为止。在进入 `while` 循环之的所有语句都会按顺序执行完毕,包括变量定义、函数调用、条件判断等[^1]。 例如,在 STM32 的标准启动流程中,`main` 函数可能包含如下结构: ```c int main(void) { HAL_Init(); // 初始化 HAL 库 SystemClock_Config(); // 配置系统时钟 MX_GPIO_Init(); // 初始化 GPIO // 其他初始化代码 while (1) { // 主循环逻辑 } } ``` 上述代码中,`HAL_Init()`、`SystemClock_Config()` 和 `MX_GPIO_Init()` 等函数调用均在 `while` 循环之执行,完成系统的基本配置和初始化工作。这些初始化操作是系统正常运行主循环的提条件[^1]。 在某些嵌入式开发环境中(如 STM32CubeMX 配合 FreeRTOS),工具链可能默认清空 `main` 函数中的 `while` 循环体,仅保留循环结构,要求开发者将任务逻辑通过任务函数添加到系统中,而不是直接写入主循环中[^3]。即便如此,`main` 函数中 `while` 循环之的初始化代码依然会被完整执行。 此外,`while` 循环本身可能不会执行,例如当循环条件不满足时,其内部代码不会运行,但 `main` 函数中循环之的代码仍会正常执行[^2]。这表明程序的执行顺序是线性的,直到遇到 `while` 循环才会根据条件决定是否进入循环。 在嵌入式系统中,`main` 函数不能正常返回,因此通常通过 `while(1)` 循环防止函数返回,避免程序“跑飞”或跳转到不可预知的地址执行[^1]。 ### 示例代码 ```c #include <stdio.h> int main(void) { printf("初始化系统...\n"); // 初始化代码 while (1) { // 主循环逻辑 } return 0; // 此行不会被执行 } ``` 在上述代码中,`printf("初始化系统...\n");` 会在进入 `while` 循环之执行,输出初始化信息。即使 `while` 循环不执行(例如条件不满足),初始化代码仍然有效执行。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值