2

程序执行必须从main开始,还是可以修改起始地址?

#include <stdio.h>

void fun();

#pragma startup fun

int main()
{
    printf("in main");
    return 0;
}

void fun()
{
    printf("in fun");
}

该程序in funin main.

4

3 回答 3

9

'#pragma' 命令在 ANSI 标准中被指定为具有任意实现定义的效果。在 GNU C 预处理器中,'#pragma' 首先尝试运行游戏'rogue';如果失败,它会尝试运行游戏“hack”;如果失败,它会尝试运行显示河内塔的 GNU Emacs;如果失败,它会报告一个致命错误。在任何情况下,预处理都不会继续。

-- Richard M. Stallman,GNU C 预处理器,1.34 版

程序执行从启动代码或“运行时”开始。这通常是一些被称为_start或类似的汇编程序,位于(在 Unix 机器上)crt0.o编译器包附带的文件中。stdin它执行运行 C 可执行文件所需的设置(例如,设置stdoutstderr,由atexit()... 用于 C++ 的向量,它还包括初始化全局对象,即运行它们的构造函数)。控制才跳到main()

正如我的回答开头的引述如此雄辩地表达的那样,做什么#pragma完全取决于您的编译器。检查其文档。(我猜你的pragma startup- 顺便说一下应该加上 a #- 告诉运行时首先调用fun()......)

于 2011-08-01T11:31:25.963 回答
2

就 ISO C 标准而言,C 程序的入口点始终是托管实现main(除非使用某些实现定义的特性来覆盖它)。对于“独立实现”(通常是嵌入式系统,通常没有操作系统),入口点是实现定义的。

于 2011-08-02T03:20:56.610 回答
1

C程序不一定从main()函数开始。在此之前执行一些代码main(),将所有未初始化的全局变量清零并用适当的值初始化其他全局变量。例如,考虑以下代码:

int a;
int b = 10;

int main()
{
    int c = a * b;
    return 0;
}

在上面的示例代码中,和a分别b在执行.010main()

#pragma指令用于定义实现定义的行为。您的代码#pragma可能会在某些编译器中编译,但可能无法在另一个编译器中编译。

于 2011-08-01T11:37:43.973 回答