C程序必须从main()函数开始执行

 我来答
幸福come了
2018-09-26 · 超过13用户采纳过TA的回答
知道答主
回答量:45
采纳率:70%
帮助的人:12.8万
展开全部

这是在面试中被问到的一个问题,回答了是。这问题第一感觉答案就是否定的,一时也没想出来理由只能回答了是。当时太紧张了,其实回想一下汇编语言就该想到程序的入口地址是可以指定的,c语言编译器默认以main作为入口地址。

网上查阅后,发现了 __attribute__ 这个关键字,它可以设置函数属性,变量属性,类型属性。

1、前言

最近看到一份代码,看到一个函数前面用__attribute__((destructor))修饰,当时感觉有点怪怪的,搜了整个程序,也没发现哪个地方调用这个函数。于是从字面意思猜想,该函数会在程序结束后自动调用,与C++中的析构函数类似。第一次接触GNU下的attribute,总结一下。

2、__attribute__介绍

__attribute__可以设置函数属性(Function Attribute)、变量属性(Variable Attribute)和类型属性(Type Attribute)。__attribute__前后都有两个下划线,并且后面会紧跟一对原括弧,括弧里面是相应的__attribute__参数

__attribute__语法格式为:__attribute__ ( ( attribute-list ) )

若函数被设定为constructor属性,则该函数会在main()函数执行之前被自动的执行。类似的,若函数被设定为destructor属性,则该函数会在main()函数执行之后或者exit()被调用后被自动的执行。例如下面的程序:

#include <stdio.h> #include <stdlib.h> static int * g_count = NULL; __attribute__((constructor)) void load_file() {     printf("Constructor is called.\n");     g_count = (int *)malloc(sizeof(int));     if (g_count == NULL)     {     fprintf(stderr, "Failed to malloc memory.\n");     } } __attribute__((destructor)) void unload_file() {     printf("destructor is called.\n");     if (g_count)     free(g_count); } int main() {     return 0; }

程序执行结果如下:

看下面的例子:

// gcc 编译器#include<stdio.h>__attribute__((constructor)) void before_main(){    printf("%s\n",__FUNCTION__);}__attribute__((destructor)) void after_main(){    printf("%s\n",__FUNCTION__);}int main(){    printf("%s\n",__FUNCTION__);    return 0;}

输出结果为:before_main

main

after_main

可以看到上面的程序并不是从main函数开始执行的。constructor 设置在main前面执行,destructor 设置在main之后执行。

推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式