程序执行必须从main开始,还是可以修改起始地址?
#include <stdio.h>
void fun();
#pragma startup fun
int main()
{
printf("in main");
return 0;
}
void fun()
{
printf("in fun");
}
该程序in fun
在in main
.
程序执行必须从main开始,还是可以修改起始地址?
#include <stdio.h>
void fun();
#pragma startup fun
int main()
{
printf("in main");
return 0;
}
void fun()
{
printf("in fun");
}
该程序in fun
在in main
.
'#pragma' 命令在 ANSI 标准中被指定为具有任意实现定义的效果。在 GNU C 预处理器中,'#pragma' 首先尝试运行游戏'rogue';如果失败,它会尝试运行游戏“hack”;如果失败,它会尝试运行显示河内塔的 GNU Emacs;如果失败,它会报告一个致命错误。在任何情况下,预处理都不会继续。
-- Richard M. Stallman,GNU C 预处理器,1.34 版
程序执行从启动代码或“运行时”开始。这通常是一些被称为_start
或类似的汇编程序,位于(在 Unix 机器上)crt0.o
编译器包附带的文件中。stdin
它执行运行 C 可执行文件所需的设置(例如,设置stdout
和stderr
,由atexit()
... 用于 C++ 的向量,它还包括初始化全局对象,即运行它们的构造函数)。控制才跳到main()
。
正如我的回答开头的引述如此雄辩地表达的那样,做什么#pragma
完全取决于您的编译器。检查其文档。(我猜你的pragma startup
- 顺便说一下应该加上 a #
- 告诉运行时首先调用fun()
......)
就 ISO C 标准而言,C 程序的入口点始终是托管实现main
(除非使用某些实现定义的特性来覆盖它)。对于“独立实现”(通常是嵌入式系统,通常没有操作系统),入口点是实现定义的。
C程序不一定从main()
函数开始。在此之前执行一些代码main()
,将所有未初始化的全局变量清零并用适当的值初始化其他全局变量。例如,考虑以下代码:
int a;
int b = 10;
int main()
{
int c = a * b;
return 0;
}
在上面的示例代码中,和a
分别b
在执行.0
10
main()
该#pragma
指令用于定义实现定义的行为。您的代码#pragma
可能会在某些编译器中编译,但可能无法在另一个编译器中编译。