我知道函数定义中参数的最小数量为零,但函数定义中的最大参数数量是多少?我只是为了知识和好奇而问这个问题,而不是我要写一个真正的功能。
答案 0 :(得分:42)
是的,实施有限制。您的答案在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语句(不包括 任何嵌套的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]。
此外,它还以18.3美元/ 6美元的价格说,
实施限制: 实施应支持 注册至少32个职能。
答案 1 :(得分:23)
实现应该能够翻译和执行 至少一个程序
包含以下限制中每一个的至少一个实例:
- 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函数为单个参数,且必须为int
或void *
类型。
答案 3 :(得分:4)
当然,如果您使用如此多的参数在C中编写函数,那么可能想要重新考虑您的程序设计。