IOCCC 1988/isaak.c - 为什么即使在 ANSIfication 之后也没有输出?
IOCCC 1988/isaak.c - why no output even after ANSIfication?
1988 年 IOCCC 获奖作品中精心制作的 self-including 代码:
http://www.ioccc.org/years.html#1988_isaak
...对于当时的某些系统来说仍然太多了。此外,ANSI C 终于成为混乱的 K&R 生态系统的稳定替代品。于是,IOCCC评委们也提供了这个词条的ANSI版本:
http://www.ioccc.org/1988/isaak.ansi.c
它的主要吸引力在于它在最后一行 (!) 中包含 <stdio.h>
和 well-thought-out #define
s 的噱头,无论是在源代码内部还是在编译时,都只允许代码的某些部分进入正确的水平。这就是允许 <stdio.h>
header 最终包含在可能的最新阶段,就在必要之前,在提供给编译器的源代码中。
然而,这个版本在今天编译时仍然无法产生输出,使用提供的编译器设置:
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 法官意识到该条目存在可移植性问题,会降低其混淆价值,因此决定还包括代码输出的 UUENCOD 版本:
此程序无法远程移植。正如我所看到的,它试图用自己的代码覆盖 exit
标准库函数,期望 return 从空 main()
调用 that exit()
,这是不正确的。即使那样,这种行为也不是 standard-conforming - 甚至 C89 也说它会有未定义的行为。
您可以通过在 main
中实际调用 exit();
来“修复”现代 GCC / Linux 上的程序 - 只需将第一行更改为
main(){exit(0);}
我编译了 gcc -std=c89 -DI=B -DO=- -Dy isaak.ansi.c
和 运行 ./a.out
并得到了合理的输出。
1988 年 IOCCC 获奖作品中精心制作的 self-including 代码:
http://www.ioccc.org/years.html#1988_isaak
...对于当时的某些系统来说仍然太多了。此外,ANSI C 终于成为混乱的 K&R 生态系统的稳定替代品。于是,IOCCC评委们也提供了这个词条的ANSI版本:
http://www.ioccc.org/1988/isaak.ansi.c
它的主要吸引力在于它在最后一行 (!) 中包含 <stdio.h>
和 well-thought-out #define
s 的噱头,无论是在源代码内部还是在编译时,都只允许代码的某些部分进入正确的水平。这就是允许 <stdio.h>
header 最终包含在可能的最新阶段,就在必要之前,在提供给编译器的源代码中。
然而,这个版本在今天编译时仍然无法产生输出,使用提供的编译器设置:
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 法官意识到该条目存在可移植性问题,会降低其混淆价值,因此决定还包括代码输出的 UUENCOD 版本:
此程序无法远程移植。正如我所看到的,它试图用自己的代码覆盖 exit
标准库函数,期望 return 从空 main()
调用 that exit()
,这是不正确的。即使那样,这种行为也不是 standard-conforming - 甚至 C89 也说它会有未定义的行为。
您可以通过在 main
中实际调用 exit();
来“修复”现代 GCC / Linux 上的程序 - 只需将第一行更改为
main(){exit(0);}
我编译了 gcc -std=c89 -DI=B -DO=- -Dy isaak.ansi.c
和 运行 ./a.out
并得到了合理的输出。