百科问答小站 logo
百科问答小站 font logo



C 语言的「void main」是怎么一代代传下来的? 第1页

  

user avatar   yao-dong-27 网友的相关建议: 
      

void main(void){}

在C语言里面也是可以编译运行的,因为C语言的函数只看名字,不看返回类型,程序在寻找入口函数的时候只是寻找叫做“main"的函数,并不在乎它的返回类型和参数类型。

这也就是C语言不允许函数重载的原因,同名函数只是参数不同,在C语言眼里就是重复的函数符号。

C语言是调用者清栈,所以main函数不写参数也可以,比如 main(void),不会运行出错,只是函数里拿不到命令行参数,但是压栈的参数还是会被正确处理

汇编层面的所谓返回值就是 函数返回的时刻 EAX 寄存器的值,无论如何EAX寄存器里总是有值的,你不去给它赋值它就是个随机数,所以即使 void main(..)也有返回值,只是随机值而已。

C语言设计上有很多不太严谨的地方,有些是早期编译器遗留的问题,大家还是要按照现代C语言规范去写代码,可读性可维护性才能更好

虽然main函数结束后程序进程也就结束了,你的代码的确不需要main函数的返回值,但是这个值还是有意义的,它会作为进程结束的状态码,返回给父进程。Unix体系特别喜欢把进程当作函数来调用,多个命令行程序组合级联来实现功能,所以启动子进程后就要用进程返回值来获取子进程是否运行正确的状态。

复习下,main函数的正确写法

       int main(int argc, char *argv[]) {     return 0; }      


user avatar   peng-an-dr-quest 网友的相关建议: 
      

这个问题下许多人都是答非所问或者带着恶意乱猜的,从微软到NeXT的官方文档里,大概从1988年开始大量的资料里的C代码都有出现void main() 或者 void main(void)的写法,几乎成了一种工程上的约定俗成,这真的就没有意义吗?还有甩锅给谭C的,更是无稽之谈,难道微软和Borland的工程师也是跟谭C学的?

在搞明白void main的来历之前,我们必须要先搞明白在(C89之前的)早期的C语言实现中,void关键字以及void作为返回的函数,比如void somefunc()是怎么来的,定义是什么,使用的场景是什么,再去考虑使用以void作为返回的主函数,也就是void main()的原因。C89标准翻遍也未必给你答案,因为在电脑编程这样的领域,工程实践是早于行业标准的,编译器的实现就是使用者的标准。

1989年一份介绍Microsoft Quick C升级的介绍里,屏幕上的截图写道

       Returns:  a pointer to void if successful, or NULL if not.     

这段说明很显然是来自Quick C的某个帮助文档的,成功就返回void的指针,失败则返回空。虽然不是用void做main的返回值,但我们看到void作为返回值确实有其应用场景的。

我们再往前追,1988年9月份的PC Magazine,看到了void main的写法,不得不说那个时代的电脑杂志真硬核,各种代码

不知不觉间我们已经逼近void指针发明的时候了,在The Art of UNIX Programming一书中层介绍到void指针起源于将C标准化的努力

在C++的发明者Bjarne Stroustrup的文章Sibling Rivalry: C and C++中,提到了“古典C语言”的概念,Steve Johnson(yacc的发明人)开发的PCC(Portable C Compiler)添加了void,枚举类型和struct,它们在ANSI标准之前被广泛使用。

然后再往后看,我们就看到了大量以void开头的函数

这样看来,C语言中使用void作为返回值或许是受到C++的前身C with Classes的影响,而理由则是类型安全

Whatever the origin, what was implemented in C with Classes was a simple type-safe notion of memory holding objects of unknown type. Any pointer can be implicitly converted to void*, and any use of the memory referred to by a void* involves a cast to some type.
无论起源如何,在C with Classes中实现的都是一个简单的类型安全的概念,用于存储未知类型的对象。任何指针都可以隐式转换为void *,并且对void *所引用的内存的任何使用都涉及到将其转换为某种类型。

但是我们还是不清楚void main的最初起源是哪里,它出现在RSA的md5代码里,出现在NASA的文档里,出现在斯坦福线性加速实验室的论文里,出现在惠普开发的早期的motif代码里,出现在SAS C编译器的手册里,它出现的平台跨越了DOS、Unix、Commodore 64、Amiga OS乃至Cray超级电脑,它注定是某种“事实标准”而不是个别工程师的错误

1990年RSA的MD5实现:people.csail.mit.edu/ri

1988年NASA的并行矩阵乘法代码:ntrs.nasa.gov/archive/n

1990年斯坦福线性加速实验室的论文:slac.stanford.edu/cgi-b

1990年惠普实验室的期刊 hpl.hp.com/hpjournal/pd

1996年,SAS C编译器手册 support.sas.com/documen

我目前能找到的最早的带有void main的手册是1985年一系列MetaWare High C编译器的手册,在High C Programmer's Guide和High C Library Reference Manual里都出现了带有void main的例子。

而更多的例子,出现在Lattice AmigaDOS C Compiler手册里,Lattice C Compiler是非常著名的微处理器C编译器,早期的Microsoft C Compiler就是从它贴牌而来,而对于Amiga平台来说Lattice C Compiler则是默认的C编译器。

上面的截图中“Returns”(返回)一节提到,“If you want to pass a non-zero termination code back to AmigaDOS, use the exit or _exit function”,非零的返回值不能直接由main函数返回,而需要调用额外的函数。这或许就是当时没有用int main的理由。

在1988年的Turbo C Reference Guide中,我们同样看到void main的出现,由于Turbo C在IBM PC开发者之间非常流行,最终void main成为了“事实标准”。


user avatar   changwei1006 网友的相关建议: 
      

这两个游戏都有自己的问题。但严重程度完全不一样。

赛博朋克最大的问题是人力不够,没有人手把愿景在限期内做出来,导致后期狂砍。但从已有的成品来看,CDPR是完全有人才有能力把东西做出来的,只不过没时间做。光影效果,已有的垂直城市设计,以及主线和很多支线任务的演出都有毫不输巫师3的气质,尤其是日本城浮空平台那关,无论是游戏流程还是画面还是音乐,都把类似银翼杀手2047的那种气氛和感受做到了极致。有人说CDPR的人才都跑了,或者CDPR傲娇了开始放水,这并不客观。2077确实是个半成品,主机优化的问题尤其严重,但你关注已经完成的部分,用高配置PC玩,其质量并未令人失望,依然是巫师3的水准。

2077就像是一个优等生忘了做背后的几题的考卷,开天窗导致不及格,但已经做了的题目还是正确率极高的。

谈到E3的demo,单从画面上讲你很难说它缩水了。只不过CDPR没告诉你想要E3画面,就得上3080+光线追踪。。。

我猜想没有光追的话,游戏在大多数情况下也是可以达到光追的效果的,只不过人工工作量会很大,有些地方需要离线烘培,而有些地方需要人工设置虚拟光源。CDPR可能发现项目后期工作量太大搂不住了,就上了光追这个大杀器。。。


至于无人深空,现在口碑很好,但我要不客气地讲,这个游戏到了今天依然是垃圾,只配卖$19.95,打折的时候卖2.95的那种。

Hello工作室自始自终都没有把初始愿景实现的技术能力。

你可以看无人深空进入大气层的技术实现。先是一段飞船进入大气层摩擦发红的特效,然后可以看见地形通过一种非常粗糙、视距很近的情况下刷新出来,并且刷出来的地貌和太空中看到的地貌完全不同。所以从头到尾,hello工作室都没有类似精英危险和星际公民的无缝行星登陆技术。

无人深空更新了十几次,并没有触动这个游戏除了机械刷就没有任何深度的本质。这是一个极其无聊的游戏。但它刷了两年的DLC,玩家也就给他点面子,没功劳有苦劳。它每次更新我都会进游戏看看,但玩不了半小时就会放弃。一是实在无聊,二是它美术设计和渲染水平有限,色彩及其刺眼。比如在母船机库里,到处都是亮瞎狗眼的点状光源,但这些光源不会照亮周围的任何东西,看的时间长了有种不带护目镜看焊接的流泪效果。你说更新了那么久,这么简单的问题都不解决,有什么用呢。游戏中随处可见低级设计的痕迹,比如说有很多行星上有一种可以卖钱的球,这种球没有任何贴图,只有亮瞎眼的纯白色材质,在HDR效果下极其刺眼,但它又不是个光源,放在地上不会照亮周围任何东西。这种打开Blender就存盘的建模初手垃圾素材居然也能放在游戏里,真是活久见。

所以无人深空就像是一个学渣冒充学霸,把期望提得无限高,却每题都答错结果接近0分,被骂,然后花了漫长的时间在那里订正,一题一题的改,最后终于接近30分了,然后获得了大家的赞赏,全然忘记了它改了那么久依然是不及格。

无人深空的贴图我就不贴了,首发的时候真是纯垃圾,基本上是2008年魔兽世界首发的那个水准。现在也依然是垃圾,开个HDR看着眼睛都疼。




  

相关话题

  为什么程序代码被编译成机器码就不能跨平台运行? 
  为什么C语言中主函数main后面有个()? 
  导热硅脂对散热性能影响大吗? 
  微软的哪一个操作系统是最难使用的? 
  在线教育平台上有哪些让你相见恨晚的计算机或互联网课程? 
  C、C++、Java、JavaScript、PHP、Python、Ruby 这些语言分别主要用来开发什么? 
  Windows 操作系统中的公文包是什么?有什么作用? 
  现在鸿蒙操作系统讨论很热,大家认为为什么当年微软没有搞起来手机操作系统呢? 
  对于少年儿童 7-8岁,如何开始计算机科学教育启蒙(Computer Science)? 
  为什么总有一些人推荐计算机学生把重点放在高数和线代? 

前一个讨论
为什么第五代移动通信(5G)热度降低了这么多?
下一个讨论
暴雨对山火中的澳大利亚是福是祸?





© 2024-11-21 - tinynew.org. All Rights Reserved.
© 2024-11-21 - tinynew.org. 保留所有权利