一个函数可以调用另一个函数。这通常会增加一些开销,例如导致堆栈溢出。
这样的限制使可移植性变得复杂,标准还需要一个函数调用链的最小可能深度吗?
澄清,假设
double fac(unsigned int n) {
return n == 0? 1: (double)n * fac(n - 1);
}
那么n
是保证fac(n)
按预期行事的最大可能输入?
答案 0 :(得分:-1)
ISO 9899:2011§§5.2.4.1中的标准保证¶1:
1实现应能够翻译和执行至少一个包含以下每个限制的至少一个实例的程序: 18)
- 127个嵌套级别的块
- ...
有人可能会争辩说这只意味着“在一个函数中嵌套的块”,但是我读到这样,这样就可以保证127个嵌套函数调用(如果这些函数都没有分配任何变量),因为每个函数调用都会引入一个块。
但是,肯定有平台可以支持更少的嵌套级别。例如,某些MSP430微控制器具有128字节或更少的RAM。在这些上,不能支持超过64个嵌套级别,因为每个函数调用都需要存储一个双字节的返回地址。