C语言必须从main函数开始执行吗?
**
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函数开始执行吗?相关推荐
- c语言程序从main()函数开始执行,所以这个函数要写在( ).,C语言程序从main()函数开始执行,所以这个函数要写在( )。...
C语言程序从main()函数开始执行,所以这个函数要写在( ). 中医传承的方式是"师傅带徒弟,语言程要写手把手教" 函数函数<团圆之后>中郑司成是被毒酒毒死的. 开始 ...
- c语言中总是从main函数开始,C语言总是从main函数开始执行吗
//-------------------------------------------------------- 本文目录结构 |-提出问题 |-解决问题 |-推荐文章 |-作业 //------ ...
- c语言程序总是从main函数开始执行,c语言程序总是从main函数开始执行吗?
是的,一个C程序总是从main函数开始执行,而不论其在程序中的位置.在main函数中可以调用程序中的其他函数,而其他函数却不可以调用main函数:程序最后再从main函数中结束. 本教程操作环境:wi ...
- c++语言程序中,main()函数必须放在程序开始的部分,C++多选题(附答案)
计算机二级考试,附答案 多选题题库 C概述 1.[多选题.2005-4]不是C语言程序的基本单位是________. (A). 程序行 (B). 函数 (C). 语句 (D). 字符 2.[多选题.2 ...
- c语言其他函数调用main函数,C语言中的main函数以及main函数是如何被调用的
main函数是C语言中比较特殊的函数,C程序总是从main函数开始执行,main函数的原型是: int main(int argc, char *argv[]); 其中argc是命令行参数的个数,ar ...
- 在c语言程序中main函数的位置,在C语言程序中,main函数的位置_________。
在C语言程序中,main函数的位置_________. 答:可以放在任意位置 一切邪教组织及其活动都是诡秘的.邪恶的.危害社会的.非法的 答:正确 产品可以根据其耐用性和是否有形而分为( ) 答:非耐 ...
- 对main函数的理解c语言,C语言编程漫谈——main函数
写在前面 促使我写这篇文章是因为我这几天找了几个一样是大三的同学,与我相同专业相同方向(物联网)的人,除了@小胡同的诗,基本没有什么其他人会现在看起来很简单的编程题目了.问了一下其他同学,他们大部分都 ...
- [汇编与C语言关系]2. main函数与启动例程
为什么汇编程序的入口是_start,而C程序的入口是main函数呢?以下就来解释这个问题 在<x86汇编程序基础(AT&T语法)>一文中我们汇编和链接的步骤是: $ as hell ...
- C语言必须写main函数?最简单的 Hello world 你其实一点都不懂!
我们在刚写程序的时候,第一个都是 hello world,而在这里,完整的代码就是: 我们打眼一看,其实很简单,就是引入头文件,写一个主函数,然后输出一句话,但是当我们编译出来ELF的时候,我们使用工 ...
最新文章
- 扩展城市信道etu模型matlab仿真,LTE System Toolbox:无线通信系统的仿真、分析和测试...
- C语言学生学籍管理系统 链表+存储数据到文档
- XML——写出XML文档(XSLT+StAX)
- oracle中sql语句的优化(转帖)
- 如何处理ESXi Hang机
- .NET程序在运行中创建EXE文件的技术
- Lnmp上安装Yaf学习(一)
- 云服务器磁盘挂载_云服务器快照是备份的吗?
- SAP Table 汇总版
- 智能远程监督系统解决方案
- 产品经理和项目经理的职责分工
- 学习笔记——共阳数码管的动态显示
- 创龙基于AM5728平台的PCIe通信案例(一)
- 各行业工资单出炉 IT类连续多年霸占“榜首”位置
- Quick #UE4 Tip (第1周 2020.12.5)
- 和风天气API 版本6和版本7
- SUST OJ 1642: 绝地求生—死亡顺序
- 有什么比较好用的视频录像软件
- 这样写也行,把hoppy放在ref这里,name放在state这里,只是相应的位置要改动,段落那里排好就行
- 算法导论第21章思考题