我们知道 C++的对象全局对象的构造函数会在main之前运行,例如windows MFC里面,在WinMain 函数前声明了一个theApp对象,其构造函数就在WinMain之前运行,其实在C语言中很早就有了,在gcc中可以使用__attribute__关键字指定如下(注意,这个和诸如on exit之类可不一样,这个是编译器编译的时候就决定了的)

在main函数前后执行函数 在gcc中,可以使用attribute关键字,声明constructor和destructor,代码如下:

 #include <stdio.h>

__attribute((constructor)) void before_main()
{
	printf("%s/n",__FUNCTION__);
}

__attribute((destructor)) void after_main()
{
	printf("%s/n",__FUNCTION__);
}

int main( int argc, char ** argv )
{
	printf("%s/n",__FUNCTION__);
	return 0;
}

没有main函数如何生成可执行文件

_start函数 _start函数是C程序的入口函数,会调用main函数。在调用main函数之前,会先执行_start函数分配必要的资源,然后再调用main函数。但是在用gcc编译程序时可以使用-nostartfiles选项来重写_start函数。示例程序如下:

#include <stdio.h>
#include <stdlib.h>

_start(void) {
printf("Hello, World!\n");
exit(0);
}

编译上面的程序的命令为: gcc -nostartfiles _start.c -o a.out 反汇编生成的可执行程序,如下所示: a.out: file format elf64-x86-64

因为这里重写了_start函数,所以gcc为默认的main函数准备的清理动作就没用上,所以如果退出的时候直接使用return,会导致程序崩溃。所以这里要使用exit()来退出程序。

gcc的-e选项 示例程序如下:

#include <stdio.h>
#include <stdlib.h>

int nomain(int i, int j, int k) {
printf("Hello, World!\n");
exit(0);
}

将上面的程序保存为m.c,编译命令如下所示: gcc -nostartfiles -e nomain m.c -o a.out 继续使用objdump反汇编生成的可执行程序,结果如下: a.out: file format elf64-x86-64