**

C语言必须从main函数开始执行吗?

**

前言

在C语言中main函数,是程序的入口,是程序的开始,也是在main函数结束。

引出问题,C语言程序必须从main函数开始吗?

回答:当然是否定的。

在C primer plus 书中是这样解释的:C程序一定是从main()函数开始执行(目前不包括特殊情况)

也就是说,C程序不一定是从main()函数开始,

下面来探讨一下,这个问题。

我查阅了一些资料,才弄清楚这个问题:


从汇编语言的角度,我们可以发现程序的入口地址是可以指定的,C语言编译器默认给我们程序指定的入口地址为main()函数地址

通过查阅的资料,发现不同的编译器指定函数的入口地址的方式不一样

简介attribute关键字

attribute可以设置函数属性(Function Attribute )、变量属性(Variable Attribute )和类型属性(Type Attribute)等.

attribute 书写特征是:attribute 前后都有两个下划线,并切后面会紧跟一对原括弧,括弧里面是相应的__attribute__ 参数。

attribute 语法格式为:attribute ((constructor)) void before_main();

constructor属性设置函数在所有函数之前执行.

destructor设置函数在所有函数退出后执行。

FUNCTION,_FILE_和_LINE_定位程序运行时的错误。程序预编译时预编译器将用所在的函数名,文件名和行号替换。当运行时错误产生后这三个宏分别能返回错误所在的函数,所在的文件名和所在的行号。

在gcc中,我们可以使用attribute关键字,声明constructor和destructor,进行指定函数的入口地址。

代码如下:

#include<stdio.h>__attribute((constructor)) void before_main(void)
{printf("调用main()之前调用的函数\n");printf("%s\n",__FUNCTION__);
}__attribute((destructor)) void after_main(void)
{printf("调用main()之后调用的函数\n");printf("%s\n",__FUNCTION__);
}
int main(int argc,char **argv)
{printf("调用main()函数\n");printf("%s\n",__FUNCTION__);return 0;
}

程序运行的结果如下:

调用main()之前调用的函数
before_main
调用main()函数
main
调用main()之后调用的函数
after_main

上述的方法适用于gcc环境中,VS不支持attribute关键字,但是在VS中也可以指定函数入口地址,方法和代码如下:

#include <stdio.h>
int
main( int argc, char ** argv)
{printf("调用main()函数\n");printf("%s\n",__FUNCTION__);return 0;
}int before_main(void)
{printf("调用main()之前调用的函数\n");printf("%s\n",__FUNCTION__);return 0;
}
int after_main(void)
{printf("调用main()之后调用的函数\n");printf("%s\n",__FUNCTION__);return 0;
}
typedef int func();
#pragma data_seg(".CRT$XIU")
static func * before[] = { before_main };
#pragma data_seg(".CRT$XPU")
static func * after[] = { after_main };
#pragma data_seg()

程序在VS2013中运行结果如下:

调用main()之前调用的函数
before_main
调用main()函数
main

程序在VS2019中运行结果如下:

调用main()之前调用的函数
before_main
调用main()函数
main

总结

在Linux环境中我们通过关键字attribute来指定程序的入口地址,证明了C语言不是必须从main函数开始执行,并且在main函数调用后,还可以调用我们指定的函数,但是在VS2013和VS2019中,得到的结果和Linux环境下得到的结果存在一些差别(具体什么原因我并没有深究)。

参考博文链接:https://blog.csdn.net/king_cpp_py/article/details/79435351
http://www.cnblogs.com/Anker/p/3462363.html

C语言必须从main函数开始执行吗?相关推荐

  1. c语言程序从main()函数开始执行,所以这个函数要写在( ).,C语言程序从main()函数开始执行,所以这个函数要写在( )。...

    C语言程序从main()函数开始执行,所以这个函数要写在( ). 中医传承的方式是"师傅带徒弟,语言程要写手把手教" 函数函数<团圆之后>中郑司成是被毒酒毒死的. 开始 ...

  2. c语言中总是从main函数开始,C语言总是从main函数开始执行吗

    //-------------------------------------------------------- 本文目录结构 |-提出问题 |-解决问题 |-推荐文章 |-作业 //------ ...

  3. c语言程序总是从main函数开始执行,c语言程序总是从main函数开始执行吗?

    是的,一个C程序总是从main函数开始执行,而不论其在程序中的位置.在main函数中可以调用程序中的其他函数,而其他函数却不可以调用main函数:程序最后再从main函数中结束. 本教程操作环境:wi ...

  4. c++语言程序中,main()函数必须放在程序开始的部分,C++多选题(附答案)

    计算机二级考试,附答案 多选题题库 C概述 1.[多选题.2005-4]不是C语言程序的基本单位是________. (A). 程序行 (B). 函数 (C). 语句 (D). 字符 2.[多选题.2 ...

  5. c语言其他函数调用main函数,C语言中的main函数以及main函数是如何被调用的

    main函数是C语言中比较特殊的函数,C程序总是从main函数开始执行,main函数的原型是: int main(int argc, char *argv[]); 其中argc是命令行参数的个数,ar ...

  6. 在c语言程序中main函数的位置,在C语言程序中,main函数的位置_________。

    在C语言程序中,main函数的位置_________. 答:可以放在任意位置 一切邪教组织及其活动都是诡秘的.邪恶的.危害社会的.非法的 答:正确 产品可以根据其耐用性和是否有形而分为( ) 答:非耐 ...

  7. 对main函数的理解c语言,C语言编程漫谈——main函数

    写在前面 促使我写这篇文章是因为我这几天找了几个一样是大三的同学,与我相同专业相同方向(物联网)的人,除了@小胡同的诗,基本没有什么其他人会现在看起来很简单的编程题目了.问了一下其他同学,他们大部分都 ...

  8. [汇编与C语言关系]2. main函数与启动例程

    为什么汇编程序的入口是_start,而C程序的入口是main函数呢?以下就来解释这个问题 在<x86汇编程序基础(AT&T语法)>一文中我们汇编和链接的步骤是: $ as hell ...

  9. C语言必须写main函数?最简单的 Hello world 你其实一点都不懂!

    我们在刚写程序的时候,第一个都是 hello world,而在这里,完整的代码就是: 我们打眼一看,其实很简单,就是引入头文件,写一个主函数,然后输出一句话,但是当我们编译出来ELF的时候,我们使用工 ...

最新文章

  1. 扩展城市信道etu模型matlab仿真,LTE System Toolbox:无线通信系统的仿真、分析和测试...
  2. C语言学生学籍管理系统 链表+存储数据到文档
  3. XML——写出XML文档(XSLT+StAX)
  4. oracle中sql语句的优化(转帖)
  5. 如何处理ESXi Hang机
  6. .NET程序在运行中创建EXE文件的技术
  7. Lnmp上安装Yaf学习(一)
  8. 云服务器磁盘挂载_云服务器快照是备份的吗?
  9. SAP Table 汇总版
  10. 智能远程监督系统解决方案
  11. 产品经理和项目经理的职责分工
  12. 学习笔记——共阳数码管的动态显示
  13. 创龙基于AM5728平台的PCIe通信案例(一)
  14. 各行业工资单出炉 IT类连续多年霸占“榜首”位置
  15. Quick #UE4 Tip (第1周 2020.12.5)
  16. 和风天气API 版本6和版本7
  17. SUST OJ 1642: 绝地求生—死亡顺序
  18. 有什么比较好用的视频录像软件
  19. 这样写也行,把hoppy放在ref这里,name放在state这里,只是相应的位置要改动,段落那里排好就行
  20. 算法导论第21章思考题

热门文章

  1. Linux Shell脚本编程入门
  2. 电脑可以上网,但是所有网页都打不开的解决办法
  3. 配置firewire or IEEE1394摄像机环境
  4. python 如何将负数转换为正数
  5. 迅为iMX6ULL开发板-创建 ap 热点
  6. 操作系统与网络 2019-1-26
  7. B. Same Parity Summands
  8. go语言 第三方包安装方法_Adobe AE 2020 软件下载安装包教程(附下载方法)
  9. 水声通信系统的建模和仿真-多径衰落信道
  10. 有啊怎么才能抗衡淘宝