并不真地。C 标准没有对必须接受的翻译单元设置任何绝对最小限制。因此,编写一个完全准确的检查器将是微不足道的,但在实践中完全没用:
#include <stdio.h>
int main(int argc, char **argv) {
int i;
for (i=1; i<argc; i++)
fprintf(stderr, "`%s`: Translation limit (potentially) exceeded.\n", argv[i]);
return 0;
}
是的,这拒绝一切,无论多么微不足道。也就是符合标准。正如我所说,它在实践中完全没有用。不幸的是,你真的不能做得更好——当你决定移植到不同的实现时,你可能会遇到一些你以前从未见过的奇怪的资源限制,所以你编写的任何代码(最多包括 " hello world") 可能会超过资源限制,尽管数十甚至数百个编译器允许在/用于更小的系统上。
编辑:
为什么“hello world”程序不严格符合
首先,值得重新说明“严格符合”的定义:“严格符合的程序应仅使用本国际标准中指定的语言和库的那些特性。2)它不应产生依赖于任何未指定、未定义、或实现定义的行为,并且不得超过任何最小实现限制。”
实际上,“Hello, World”没有严格符合的原因有很多。首先,如上所述,实施限制的最低要求是完全没有意义的——尽管必须有一些满足某些限制的程序才能被接受,但没有其他程序必须被接受,即使它甚至没有接近到任何这些限制。考虑到要求的表述方式,(充其量)是否存在不超过任何最低实现限制的程序之类的东西是有待商榷的,因为该标准并没有真正定义任何最低实现限制。
其次,在翻译的第一阶段:“物理源文件多字节字符以实现定义的方式映射到源字符集......”(§5.1.1.2/1)。自从“你好,世界!” (或您喜欢的任何变体)在源文件中作为字符串文字提供,它可以(是)以实现定义的方式映射到源字符集。一个实现可以自由地决定(对于一个愚蠢的例子)字符串文字将被 ROT13 编码,只要这个事实被正确记录,它就是完全合法的。
第三,输出通常是通过stdout
. stdout
是一个文本流。根据标准:“字符可能必须在输入和输出中添加、更改或删除,以符合在主机环境中表示文本的不同约定。因此,字符之间不需要一一对应在流中和在外部表示中的那些。” (§7.19.2/2)因此,实现可以(例如)对输出进行 Huffman 压缩(在星期一、星期三或星期五)。
所以,我们有(至少)三个不同的点,在这些点上来自“Hello,World!”的输出。取决于实现定义的特征——其中任何一个都会阻止它符合严格符合程序的定义。