c - IOCCC 1988/isaak.c - 为什么即使在 ANSI 化之后也没有输出?
问题描述
从 1988 年开始,这个 IOCCC 获奖作品中精心制作的、自包含的代码:
http://www.ioccc.org/years.html#1988_isaak
...当时对于某些系统来说仍然太多了。此外,ANSI C 终于成为混乱的 K&R 生态系统的稳定替代品。因此,IOCCC 评委也提供了这个条目的 ANSI 版本:
http://www.ioccc.org/1988/isaak.ansi.c
它的主要吸引力在于它<stdio.h>
在最后一行 (!) 中包含经过深思熟虑的#define
s,无论是在源代码内部还是在编译时,都只允许代码的某些部分进入正确的级别。这就是允许<stdio.h>
头文件最终包含在可能的最新阶段的原因,就在需要之前,在提供给编译器的源代码中。
但是,在今天使用提供的编译器设置进行编译时,此版本仍然无法生成输出:
gcc -std=c89 -DI=B -DO=- -Dy isaak.ansi.c
tcc -DI=B -DO=- -Dy isaak.ansi.c
使用的版本:GCC 9.3.0、TCC 0.9.27
对编译后的二进制文件名没有任何明显的依赖,因此我将其留给编译器选择。即使使用-o isaak
or -o isaak.ansi
,也会发生相同的结果:没有输出。
这是什么原因造成的?输出功能如何失败?可以做些什么来纠正这个问题?
提前致谢!
注意:IOCCC 法官意识到该条目存在可移植性问题,会降低其混淆值,因此决定还包括代码输出的 UUENCODE 版本:
解决方案
该程序没有任何远程可移植性。正如我所看到的,它试图exit
用自己的代码覆盖标准库函数,期望从空返回main()
会调用that exit()
,这是不正确的。即便如此,这种行为也不符合标准——甚至 C89 也表示它会有未定义的行为。
exit();
您可以通过实际调用内部“修复”现代 GCC / Linux 上的程序main
- 只需将第一行更改为
main(){exit(0);}
我编译gcc -std=c89 -DI=B -DO=- -Dy isaak.ansi.c
并运行./a.out
并得到了合理的输出。
推荐阅读
- c# - 使用 swashbuckle 向 swagger 中的路径添加摘要或供应商扩展
- go - 如何在不影响性能的情况下为 logrus golang 中的所有请求打印自定义公共字段
- javascript - 如何在typeorm上添加带有静态选择的选择
- javascript - Chrome 扩展删除侦听器不起作用
- azure - azure Web 应用程序的请求资源上不存在“Access-Control-Allow-Origin”标头
- ionic-framework - 在 Memu 模拟器中运行 Ionic App 无法正常工作
- node.js - 为什么我仍然有警告:即使我已经返回了一个承诺,也应该在云函数中的异步箭头函数的末尾返回一个值?
- javascript - JS 将整个对象传递给函数会占用更多内存
- javascript - 不要从函数返回变量
- android - 如何在 AndroidX 中使用 Fragments 实现 ViewPager