C专家编程
上QQ阅读APP看书,第一时间看更新

1.7 编译限制

事实上,ANSI C标准对一个能够成功编译的程序的最小长度作了限制,这是在标准的第5.2.4.1节规定的。绝大多数语言都有类似的规定,如一个数据名称(dataname)最多可以有多少个字符,一个多维数组的维数最多能够达到多少。但对语言的某种特性的最小值作出规定,如果不是独此一家,至少也是非比寻常的。标准委员会的成员评论说,这是为了指导编译器选择程序最小能够接受的长度。

每一个ANSI C编译器必须能够支持:

  • 在函数定义中形参数量的上限至少可以达到31个;
  • 在函数调用时实参数量的上限至少可以达到31个;
  • 在一条源代码行里至少可以有509个字符;
  • 在表达式中至少可以支持32层嵌套的括号;
  • long int的最大值不得小于2147483647(就是说,long型整数不得低于32位),等等。

进而,一个遵循标准的编译器必须能够编译并执行一个满足上面这些限制的程序。令人惊异的是,上面这些“必须”的限制实际上并不是约束条件,所以当编译器发现违反上述规定的情况时并不一定产生错误信息。

编译器限制通常是一个“编译器质量”的话题。在ANSI C标准中包含它们,就是默认如果所有的编译器都设置一些容量上的限制,将会更加有利于代码的移植。当然,一个真正优秀的编译器不应该有预设的限制,而应该只受一些外部因素的限制,如可用的内存或硬盘空间等。这可以通过使用链表或在必要时动态扩展表的大小(这个技巧将在第10章解释)来实现。