函数声明中的最大参数数

Naw*_*waz 27 c c++ limits function-parameter function-declaration

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

Naw*_*waz 45

是的,实施有限制.您的答案在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].
    - 成员在一个班级[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

2. C语言


5.2.4.1翻译限制


该实现应能够转换执行 至少一个包含以下每个限制的至少一个实例的程序:
- 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)实施应尽可能避免强加固定的翻译限制.

  • @ Mr.32:谷歌的"C语言标准n1256".在搜索时,我得到了这个链接:http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1256.pdf (2认同)

wal*_*lyk 7

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

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

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

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

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