函数声明中的最大参数数

时间:2011-01-03 04:11:30

标签: c++ c limits function-declaration function-parameter

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

4 个答案:

答案 0 :(得分:42)

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

1。 C ++语言


附件B - 实施数量

  
      
  1. 由于计算机是有限的,C ++实现不可避免地受到限制   他们可以在程序的大小   成功处理。的每   实施应记录这些   已知的局限性。这个   文件可以引用固定限制   它们存在的地方,说如何计算   变量限制作为函数   可用资源,或者说固定   限制不存在或未知。

  2.   
  3. 限制可能会限制包含下述内容或数量的数量   其他。 以下括号内的数字   建议将每个数量作为   该数量的最小值。但是,   这些数量只是指导原则   并且不确定合规性。
    -   嵌套复合语句的级别,   迭代控制结构,和   选择控制结构[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]。
    - 每个处理人员   尝试阻止[256]。
    - 扔   单一功能的规格   声明[256]。

  4.   

此外,它还以18.3美元/ 6美元的价格说,

  

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

答案 1 :(得分:23)

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个案例标签(不包括任何嵌套交换机的案例标签) 语句)
- 单一结构或工会中的1023名成员
- 单个枚举中的1023个枚举常量
- 单个struct-declaration-list中的63个嵌套结构或联合定义的级别

然而,它在笔记中说,

  

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

答案 2 :(得分:7)

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

例如VAX CPU architecture使用一个包含参数数量的8位字段,因此符合规范的VAX代码不能传递超过255个参数。

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

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

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

答案 3 :(得分:4)

当然,如果您使用如此多的参数在C中编写函数,那么可能想要重新考虑您的程序设计。