繁体   English   中英

函数声明中的最大参数数

[英]Maximum number of parameters in function declaration

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

是的,实施存在限制。 以下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语句的大小写标签(不包括任何嵌套switch语句的大小写标签)[16 384]。
    —单个类,结构或联合中的数据成员[16 384]。
    —单个枚举中的枚举常量[4 096]。
    —单个struct-declaration-list中的嵌套类,结构或联合定义的级别[256]。
    —由atexit()[32]注册的函数。
    —直接和间接基类[16 384]。
    —单个类的直接基类[1024]。
    —成员在一个班级中宣布[4 096]。
    —类中的最终重写虚拟函数,可访问或不可访问[16 384]。
    —类[1 024]的直接和间接虚拟库。
    —类[1 024]的静态成员。
    —类别中的朋友声明[4 096]。
    —类[4 096]中的访问控制声明。
    —构造函数定义中的成员初始化程序[6 144]。
    —一个标识符的范围限定[256]。
    —嵌套的外部规格[1 024]。
    —模板声明[1 024]中的模板参数。
    —递归嵌套的模板实例化[17]。
    —每个try块的处理程序[256]。
    —将规范投在单个函数声明[256]上。

此外,它还说$ 18.3 / 6,

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

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个案例标签(不包括任何嵌套的switch语句的案例标签)
—单个结构或联合中的1023个成员
—单个枚举中的1023枚举常量
—在单个struct-declaration-list中包含63个嵌套结构或并集定义的级别

但是,它在注释中说,

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

正如先前的回答者已经充分指出的那样,参数的数量取决于C ++编译器。 编译器限制很可能是由于硬件环境施加的限制。

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

同样,许多小型处理器(如Intel 8048家族)的内存也受到限制,如果使用更多的四个参数,大多数C和C ++编译器都会感到沮丧。 尽管许多主流开发人员可能会对8048表示嘲笑,但其后代仍然是部署最广泛的CPU之一-主要在嵌入式设备中。

许多RISC体系结构实现都使用寄存器而不是堆栈来指定参数传递方法。 例如,一个基本的ARM CPU只有16个寄存器。 参数的最大数目可能完全取决于编译器命令行选项,这些选项会影响编译器生成代码以传递参数的方式。 也许有八个以上被推入堆栈。 也许不吧。

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

当然,如果您要使用大量参数在C中编写函数,则可能需要重新考虑程序的设计。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM