函数声明中的最大参数数

我知道函数定义中参数的最小数量为零,但函数定义中的最大参数数量是多少? 我只是为了知识和好奇而问这个问题,而不是我要写一个真正的function。

是的,实施有限制。 您的答案在C ++标准的以下摘录中以粗体显示。

1. C ++语言

附件B – 实施数量

  1. 由于计算机是有限的,因此C ++实现不可避免地受限于它们可以成功处理的程序的大小。 每个实施都应记录已知的限制。 本文档可引用存在的固定限制,说明如何根据可用资源计算变量限制,或者说固定限制不存在或未知。

  2. 限制可能会限制包括下面描述的数量或其他数量的数量。 建议将每个数量后面的括号内的数字作为该数量的最小值。 但是,这些数量仅是指导原则,不能确定合规性。
    – 嵌套复合语句,迭代控制结构和选择控制结构的级别[256]。
    – 嵌套条件包含的级别[256]。
    – 指针,数组和函数声明符(以任意组合)在声明中修改算术,结构,并集或不完整类型[256]。
    – 在完整表达式中嵌套带括号的表达式级别[256]。
    – 内部标识符或宏名称中的字符数[1 024]。
    – 外部标识符中的字符数[1 024]。
    – 一个翻译单位的外部标识符[65 536]。
    – 在一个块[1 024]中声明具有块范围的标识符。
    – 在一个翻译单元中同时定义的宏标识符[65 536]。
    – 一个函数定义[256]中的参数。
    – 一个函数调用中的参数[256]。
    – 一个宏定义中的参数[256]。
    – 一次宏调用中的参数[256]。
    – 一个逻辑源行中的字符[65 536]。
    – 字符串文字或宽字符串文字中的字符(连接后)[65 536]。
    – 物体的大小[262 144]。
    – #include文件的嵌套级别[256]。
    – switch语句的case标签(不包括任何嵌套switch语句的标签)[16 384]。
    – 单个类,结构或联合中的数据成员[16 384]。
    – 单个枚举中的枚举常量[4 096]。
    – 单个struct-declaration-list中的嵌套类,结构或联合定义的级别[256]。
    – 由atexit()[32]注册的函数。
    – 直接和间接基类[16 384]。
    – 单个类的直接基类[1024]。
    – 成员在一个class级[4 096]中宣布。
    – 最终覆盖类中的虚函数,可访问与否[16 384]。
    – 类的直接和间接虚拟基础[1 024]。
    – 类的静态成员[1 024]。
    – class级中的朋友声明[4 096]。
    – 类[4 096]中的访问控制声明。
    – 构造函数定义中的成员初始值设定项[6 144]。
    – 一个标识符的范围限定[256]。
    – 嵌套外部规范[1 024]。
    – 模板声明中的模板参数[1 024]。
    – 递归嵌套模板实例化[17]。
    – 每个try块的处理程序[256]。
    – 在单个函数声明上抛出规范[256]。

此外,它还说18.3 / 6美元,

实施限制:实施应支持至少32个function的注册。

2. C语言

5.2.4.1翻译限制

该实现应能够翻译执行 至少一个包含以下每个限制的至少一个实例的 程序
– 127个嵌套级别的块
– 63个嵌套级别的条件包含
– 12个指针,数组和函数声明符(以任意组合)修改声明中的算术,结构,联合或不完整类型
– 完整声明符中63个带括号的声明符的嵌套级别
– 完整表达式中63个带括号的表达式嵌套级别
– 内部标识符或宏名称中的63个重要初始字符(每个通用字符名称或扩展源字符被视为单个字符)
– 外部标识符中的31个重要的初始字符(每个通用字符名称
指定0000FFFF或更短的短标识符被认为是6个字符,指定短标识符00010000或更多的每个通用字符名称被认为是10个字符,并且每个扩展源字符被认为是与相应的通用字符名称相同的字符数,如果任何)
– 一个翻译单元中的4095个外部标识符
– 在一个块中声明了具有块作用域的511个标识符
– 在一个预处理转换单元中同时定义的4095个宏标识符
– 一个函数定义中的127个参数
– 一个函数调用中的127个参数
– 一个宏定义中的127个参数
– 一次宏调用中的127个参数
– 逻辑源行中的4095个字符
– 字符串文字或宽字符串文字中的4095个字符(连接后)
– 对象中的65535个字节(仅限托管环境中)
– #included文件的15个嵌套级别
– switch语句的1023个case标签(不包括任何嵌套switch语句的标签)
– 单一结构或工会中的1023名成员
– 单个枚举中的1023个枚举常量
– 单个struct-declaration-list中的63个嵌套结构或联合定义的级别

然而,它在笔记中说,

13)实施应尽可能避免强加固定的翻译限制。

正如之前的回答者已经充分注意到的,参数的数量取决于C ++编译器。 编译器限制可能是由硬件环境施加的限制造成的。

例如, VAX CPU架构使用一个8位字段来保存参数的数量,因此兼容的VAX代码不能传递超过255个参数。

同样,像英特尔8048系列这样的许多小型处理器都受内存限制,如果使用更多的四个参数,大多数C和C ++编译器都会感到悲伤。 虽然许多主流开发人员可能会嘲笑8048,但它的后代仍然是部署最广泛的CPU之一 – 主要是嵌入式设备。

许多RISC架构实现使用寄存器而不是堆栈来指定参数传递方法。 例如,基本的ARM CPU只有16个寄存器。 参数的最大数量很可能取决于编译器命令行选项,这些选项会影响它如何生成传递参数的代码。 也许超过八个被推入堆栈。 也许不吧。

如果这些示例看起来过于严格,请考虑Palm OS将C函数限制为单个参数,并且必须是intvoid *类型。

当然,如果您在C中编写具有如此大量参数的函数,您可能想重新考虑程序的设计。