gpt4 book ai didi

c - IOCCC 1988/isaak.c - 为什么即使在 ANSI 化之后也没有输出?

转载 作者:行者123 更新时间:2023-12-03 23:43:34 25 4
gpt4 key购买 nike

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-o isaak.ansi ,同样的结果发生:没有输出。
这是什么原因造成的?输出功能如何失败?可以做些什么来纠正这个问题?
提前致谢!
注意:IOCCC 法官意识到该条目存在可移植性问题,会降低其混淆值,因此决定还包括代码输出的 UUENCODEd 版本:
http://www.ioccc.org/1988/isaak.encode

最佳答案

这个程序没有任何远程可移植性。正如我所见,它试图覆盖 exit具有自己代码的标准库函数,期望从空返回 main()会称之为 exit() ,这是不正确的。即便如此,这种行为也不符合标准——甚至 C89 也表示它会有未定义的行为。
您可以通过实际调用 exit(); 来“修复”现代 GCC/Linux 上的程序。内main - 只需将第一行更改为

main(){exit(0);}
我编译 gcc -std=c89 -DI=B -DO=- -Dy isaak.ansi.c并运行 ./a.out并得到了合理的输出。

关于c - IOCCC 1988/isaak.c - 为什么即使在 ANSI 化之后也没有输出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64302661/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com