可以在没有main()的情况下编写C程序吗?

C 语言程序终止的艺术:理解 return main 与 exit() 函数 本文探讨了C语言中两种程序终止方式:main函数的return语句和exit()函数。main函数是程序的入口点,通过return语句可以正常终止程序并返回状态码,通常0表示成功,非0表示错误。exit()函数则提供了一种立即终止程序的方式,无论调用位置如何,适用于处理致命错误或强制退出场景。文章通过代码示例展示了这两种方法的使用场景和区别,并建议在正常流程中使用return,在紧急情况下使用exit()。 阅读详情

是的,你可以编写一个没有main()的C程序 。

这是一个广受好评的“Hello World”程序,没有main()。


 
  1. #include <stdio.h>
  2. extern void _exit (register int );
  3. int _start (){
  4. printf (“ Hello World \ n ”);
  5. _exit (0 );
  6. }

几乎每本书都教我们main()是程序执行的切入点。这不完全正确。从抽象层面来说,从程序员的角度来看也是如此。但是从系统的角度来看,_start()是第一个被调用的函数。_start()设置程序执行的环境,然后调用main()。

这是上述程序的输出。

编辑1:这里有一些关于为什么我写了extern void _exit(register int)的信息;

_start()和_exit()是“系统”在程序执行之前自动调用以设置环境并执行其他一些机器级工作的函数。_exit()是预定义的,因此我们使用外部存储类(即extern)告诉编译器它已经在某处声明了。如果我们错过了extern关键字,我们试图重载在C语言中无效的函数。

_exit()在机器级工作,因此它需要具有寄存器存储类的数据类型的输入,因此使用了register关键字。如果你不编写extern void _exit(register int),编译器会给你一个警告,但程序运行正常:)

编辑2:我今天收到了这条消息:

你怎么知道首先调用_start然后调用main()?

我问这个问题的唯一目的是从哪里可以获得有关编程的这些细节?

在每本书中,我们都可以轻松找到语法和所有语言结构,但这些东西缺少某些细节。

能帮助我/指导我从哪里了解这些细节吗?

实际上这是一个非常好的问题,这就是为什么我要更新我的答案,但答案很简单,比你想象的要简单。一切都在我们面前,我们只需要更多地关注我们通常忽略的微小细节。

因此,为了让您知道我如何了解_start,我将使用一个示例向您展示。这是一个我编写的简单程序,它没有main()。

现在让我们编译并运行该程序,看看会发生什么。

它说在函数_start中:对main的未定义引用。这意味着_start()中没有对main()的引用。

那是我开始了解_start的时候。然后只是谷歌的一点帮助我发现了这个函数到底是什么,它是在main()之前首先调用的函数。所以你看,我们必须停止忽略错误或警告,并应该寻找它们实际意味着什么。唯一能教你学习并让你学习的老师就是你自己:)

int main()和void main()有什么区别 其实main也是一个函数; (1) #include<stdio.h> void main(){ } void main() 这样定义只是说明main函数没有返回值。 (2) #include<stdio.h> int main(void){ return 0; } int main(void)和int main()是一样的(括号里没有东西就相当于void) 说明main函数有一个int类型的返回值。 int main()是C语言的规范,要求main函数返回一个int类型 阅读详情

相关推荐

超越音频!STM32 SAI接口在AD7768高速ADC采集中的妙用(含PCB布局指南)

本文深入探讨了如何将STM32的SAI接口应用于AD7768高速ADC的数据采集系统,超越了其传统的音频应用范畴。文章详细解析了SAI协议与ADC时序的匹配方法,提供了从CubeMX配置、DMA数据搬运到关键PCB布局指南的完整实战方案,旨在帮助工程师实现稳定、高精度的工业级高速数据采集。

efc12345678的博客 304

没有了 main 函数,程序还能跑吗?

文章目录刑天代码编译运行探索疑问指定 刑天 刑天,是中国远古神话传说人物,手使一柄巨斧和盾牌,身强力壮,体型巨大的上古巨人,炎帝手下大将,和黄帝争位,被斩去头颅,失了首级后,以双乳为眼,肚脐为口,再战黄帝。 刑天没有了头仍然可以战斗,程序没有了 main 函数,还能跑吗? 答案是:可以的。 代码 nomain.c #include <stdio.h> #include <stdlib.h> void nomain() { printf("hello world\n

lyndon 1万+

swl安装无法与服务器建立链接,如何解决?

🏆本文收录于《全栈Bug调优(实战版)》专栏,主要记录项目实战过程中所遇到的Bug或因后果及提供真实有效的解决方案,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!! 备注:部分问题/疑难杂症搜集于互联网。

**My Coding Family** 2074

C语言中无main函数编写方法

文章转自:http://www.codeweblog.com 学习C语言的同学都知道,每个C程序要有一个main函数,程序从main函数开始执行,在main函数中结束。但事实上,C程序也可以没有main函数,或者说自己可以指定入口函数。下面这篇文章介绍了如何实现这一过程。这篇文章转自:http://www.codeweblog.com,作者不详。学习这个内容对程序设计没啥影响,但能更深入地了解程序编译和链接的原理。 这篇文章主要介绍了c语言之没有main函数的helloworld示例,本文分解了带main函

zhengbanjunlin的博客 1816

新手也能写复杂爬虫!AI+Python自动分析京东商品,提取数据不用F12

不用F12:AI自动分析京东页面,生成选择器;不用懂JS:Playwright自动渲染动态数据;不用改代码:只需配置3个参数,复制运行就能出结果。这套方案不仅适用于京东,修改提示词后还能爬取淘宝、拼多多、亚马逊等电商网站,新手只需掌握“配置参数→运行代码→查看CSV”3步,就能轻松获取任意网站的结构化数据。未来,AI会让爬虫彻底进入“零代码、零门槛”时代,新手也能轻松搞定复杂数据爬取需求。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 1340

【OpenClaw企业级智能体实战】第11篇:制造业设备预测性维护实战——OpenClaw+DeepSeek+Prometheus从零搭建(附完整代码)

本文聚焦制造业设备预测性维护的核心痛点,基于OpenClaw v2026.2.1、DeepSeek智能诊断、Prometheus监控等工具,拆解“设备状态监控→智能故障诊断→预测性维护”三大核心场景。从技术原理、算法构建、实操流程到完整代码实现,提供“数据采集→模型训练→智能调度→自动处置”的全链路方案。方案遵循工业安全规范,采用“只读优先、权限最小化”原则,适配中小制造企业落地需求。通过虚拟案例验证,可使设备非计划停机时间下降65%、平均修复时间缩短47%,既适合新手快速入门,也为进阶读者提供架构优化思路

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 606

C语言程序可以没有main函数

原文链接:http://www.wufangbo.com/175871/学习C语言的同学都知道,每个C程序要有一个main函数,程序从main函数开始执行,在main函数中结束。但事实上,C程序也可以没有main函数,或者说自己可以指定入口函数。下面这篇文章介绍了如何实现这一过程。这篇文章转自:http://www.codeweblog.com,作者不详。学习这个内容对程序设计没啥影响,但能更深入...

阁 1万+

手把手教你学PCIE(2.1.23)--PCIe基本概念:链路速率协商

链路速率协商是一个多步骤的过程,确保发送端和接收端之间的链路速率设置一致。通过初始化链路速率寄存器、发送和接收 TS2 序列、检测链路对端的存在、交换链路速率信息、确定最大链路速率和配置链路速率,可以确保 PCIe 设备之间的数据传输速度最大化,从而提高数据传输效率。初始化链路速率寄存器:设置支持的最大链路速率。发送和接收 TS2 序列:检测链路对端的存在。交换链路速率信息:发送和支持的最大链路速率。确定最大链路速率:选择最小值作为最终链路速率。配置链路速率:更新链路速率寄存器。

MHD0815的博客 1815

C 语言 int main() 和 int main(void) 的区别

在C语言编程中通常会看到 **int main()、int main(void)、void main(void)、main()和main(void)、int main() 和 void 首先来看看标准的主函数写法是什么样的,在C99标准(ISO/IEC 9899:1999)的5.1.2.2.1 Program startup一节是这么描述的: The function called at program startup is namedmain. The implementation declar

qq_41853417的博客 4万+

【占用网络】OccNet: Scene as Occupancy 适用于检测、分割和规划任务 ICCV2023

本文分享“占用网络”方案中,具有代表性的方法:OccNet。它以多视角视觉为核心,首先生成BEV特征,然后通过级联结构和时间体素解码器重建生成3D占用特征。构建一个通用的“3D占用编码特征”,用以表示3D物理世界。这样的特征描述可以应用于广泛的自动驾驶任务,包括检测、分割和规划。

黎国溥 3360

一文探讨视频秒开:m3u8视频格式与视频秒开优化

秒开指的是,一秒内成功加载的播放数/播放总数。本意是想对比一下m3u8与mp4视频格式,并了解m3u8格式优缺点,以确定一个大概优化方向。但对m3u8做简单了解后,觉的m3u8可能是一个优化方向。

bjxiaxueliang的CODING小栈 2万+

C语言之main()函数

C的设计原则是把函数作为程序的构成模块。main()函数称之为主函数,一个C程序总是从main()函数开始执行的。一、main()函数的形式在最新的 C99 标准中,只有以下两种定义方式是正确的:int main( void )--无参数形式{...return 0;}int main( int argc, char *argv[] )--带参数形式{...return 0;}int指明了main

leesphone的专栏 5363

VictoriaMetrics | 云原生监控新宠: 使用 vmagent 工具采集 VM 集群指标实战

摘要:本文介绍了vmagent工具的安装部署及配置实践,该工具是VictoriaMetrics官方提供的指标采集组件,支持兼容Prometheus指标采集与转发。文章详细讲解了从二进制方式部署vmagent的步骤,包括下载安装、创建运行环境、配置systemd服务等过程。通过8429端口可查看采集状态,并演示了将Prometheus配置迁移到vmagent的方法。vmagent可实现远程写入VictoriaMetrics集群,为云原生监控提供高效解决方案。

全栈工程师修炼指南-IT知识分享 444

C语言的void main()

很多人甚至市面上的一些书籍,都使用了void main( ),其实这是错误的。C/C++中从来没有定义过void main( )。C++之父Bjarne Stroustrup在他的主页上的FAQ中明确地写着The definition void main( ) { /* ... */ } is not and never has been C++, nor has it even been C.(...

corleone_4ever的博客 1万+

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

C语言中没有main函数生成可执行程序的几种方法

1、define预处理指令 这种方式很简单,只是简单地将main字符串用宏来代替,或者使用##拼接字符串。示例程序如下: #include #define begin main int begin(void) { printf("Hello, World!\n"); return 0; } #include #define beg

Justlinux2010的专栏 7659

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

在一个C程序中,main()函数可以放在哪?

C语言规定,在一个C程序中,main()函数的位置()。 A.必须在系统调用的库函数之后 B.必须在程序的开始 C.必须在程序的最后 D.可以在任意位置 答案:D [解析] 每个C程序有且只有一个主函数(main),且程序必须从main()函数开始执行,而且main()函数可以放在程序中的任意位置。 ...

点滴记忆 2万+

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

没有return关键字的main()函数返回值

main() 函数的返回值类型必须是 int ,这样返回值才能传递给程序的激活者表示程序正常退出。int main(void) 不等同于 int main() ,后者并不代表参数为空,而是不可预料的参数。return 是语言级的关键字,实现了调用堆栈的返回;return是返回数值并退出函数,如果是在主函数main(), return 返回一个int值,并结束当前进程,如果不是在main函数中,那就是

嵌入式陈浩的优快云博客 5753

C语言main()函数详解

C的设计原则是把函数作为程序的构成模块。main()函数称之为主函数,一个C程序总是从main()函数开始执行的。 一、main()函数的形式 在最新的 C99 标准中,只有以下两种定义方式是正确的: int main( void )  /* 无参数形式 */ {     ...     return 0; } int main( int argc, char *argv[]

neeJack的博客 1278

在C语言中,程序的执行总是从main()函数开始。main()函数是C程序的入口点,它是程序执行的起点

当程序执行到函数调用时,它会跳转到该函数的代码块并执行函数中的代码,直到函数执行完毕或遇到return语句返回main()函数或其他函数。当函数定义中包含指针参数时,函数内部可以对指针指向的变量进行修改,从而改变调用代码中的变量值。当函数执行完毕时,控制权将返回调用该函数的代码行,程序将继续执行。代码区用于存储程序的二进制代码,数据区用于存储初始化的全局变量和静态变量,而BSS区用于存储未初始化的全局变量和静态变量。总之,C语言的执行过程是从main()函数开始,按照代码定义的顺序逐行执行代码。

博客域名:borter.blog.youkuaiyun.com 5467

c 语言 一定要有main 吗,语言律师-C程序是否需要main()?

语言律师-C程序是否需要main()?标题说明了一切。 main()函数对于C程序是否绝对必要?我之所以这样问是因为我正在查看Linux内核代码,但是没有看到main()函数。elricL asked 2020-08-09T21:39:40Z7个解决方案63 votes不,ISO C标准规定,仅在托管环境(例如具有基础操作系统的环境)中才需要5.1.2函数。对于像嵌入式系统(或操作系统本身)这样的...

weixin_33955307的博客 794

C语言——int main,main 和 void main;return

先简而言之 1.void 和 int 表明声明不同的主函数返回值,不声明则默认返回值为int整型。 2.int main可移植性强。 3.C语言从来没声明过```void main```,只声明过```main()```。 3.抛弃一切用```void main```编写C程序的习惯!   稍微深入 main函数,又称主函数,作为绝大大部分C程序唯一的入口(比如windows编程中可

阿呆的博客 2606

编译一个不带main()函数的应用程序

【版权申明】未经博主同意,谢绝转载!(请尊重原创,博主保留追究权) 编译一个不带main()函数的应用程序 源码交代: $cat file.c #include<stdio.h> void func(void) { printf("hello\n"); } int my_main(void) { func(); retur...

手中沙的博客 3198
上一篇: C语言程序可以没有main函数
下一篇: Linux多线程编程(一)---多线程基本编程
csshuke
博客等级 码龄16年 1517粉丝 8原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值