Naw*_*waz 27 c c++ limits function-parameter function-declaration
我知道函数定义中的最小参数数量为零,但函数定义中的最大参数数量是多少?我只是为了知识和好奇而问这个问题,而不是我要写一个真正的功能.
Naw*_*waz 45
是的,实施有限制.您的答案在C++标准的以下摘录中以粗体显示.
由于计算机是有限的,因此C++实现不可避免地受限于它们可以成功处理的程序的大小.每个实施都应记录已知的限制.本文档可引用存在的固定限制,说明如何根据可用资源计算变量限制,或者说固定限制不存在或未知.
限制可能会限制包括下面描述的数量或其他数量的数量.建议将每个数量后面的括号内的数字作为该数量的最小值.但是,这些数量仅是指导原则,不能确定合规性.
- 嵌套复合语句,迭代控制结构和选择控制结构的级别[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].
- 成员在一个班级[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个功能的注册.
Naw*_*waz 24
该实现应能够转换和执行 至少一个包含以下每个限制的至少一个实例的程序:
- 127个嵌套级别的块
- 63个嵌套级别的条件包含
- 12个指针,数组和函数声明符(在任何组合中)修改声明中的算术,结构,联合或不完整类型
- 完整声明
符中的括号声明符的
63个嵌套级别
- 完整表达式中63个带括号的表达式的嵌套级别- 内部标识符中的63个重要初始字符或宏名称(每个通用字符名称或扩展源字符被视为单个字符)
- 外部标识符中的31个重要初始字符(
指定短标识符0000FFFF或更少的每个通用字符名称被视为6个字符,每个通用字符名称指定短标识符00010000或更多被认为是10个字符,每个e xtended源字符被认为是与相应的通用字符名称相同的字符数(如果有的话)
- 一个转换单元中的4095个外部标识符
- 在一个块中声明的块范围的511个标识符
- 在一个预处理转换单元中同时定义的4095个宏标识符
-一个函数定义中的
127个参数 - 一个函数调用中的
127个参数 - 一个宏定义中的
127个参数 - 一个宏调用中的127个参数
- 逻辑源行中的
4095个字符 - 字符串文字或宽字符串文字中的4095个字符(连接后) )
- 对象中的65535个字节(仅限托管环境中)
- #included文件的15个嵌套级别
- 用于switch语句的1023个case标签(不包括任何嵌套switch语句的那些)
- 单个结构或联合中的1023个成员
- 1023单个枚举中的枚举常量
- 嵌套结构或联合定义中的63个列表 le struct-declaration-list
然而,它在笔记中说,
13)实施应尽可能避免强加固定的翻译限制.
正如之前的回答者已经充分注意到的那样,参数的数量取决于C++编译器.编译器限制可能是由硬件环境施加的限制造成的.
例如,VAX CPU架构使用一个8位字段来保存参数的数量,因此兼容的VAX代码不能传递超过255个参数.
同样,像英特尔8048系列这样的许多小型处理器都受到内存的限制,如果使用更多关于四个参数的话,大多数C和C++编译器都会感到悲伤.虽然许多主流开发人员可能会嘲笑8048,但它的后代仍然是部署最广泛的CPU之一 - 主要是嵌入式设备.
许多RISC体系结构实现使用寄存器而不是堆栈来指定参数传递方法.例如,基本的ARM CPU只有16个寄存器.参数的最大数量很可能取决于编译器命令行选项,这些选项会影响它生成传递参数的代码的方式.也许超过八个被推入堆栈.也许不吧.
如果这些示例看起来过于严格,请考虑Palm OS将C函数限制为单个参数,并且必须是类型int或void *.