34

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

4

4 回答 4

52

是的,实施有限制。您的答案在以下 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]。
    — 每个尝试块的处理程序 [256]。
    — 在单个函数声明中抛出规范 [256]。

此外,它还以 $18.3/6 的价格显示,

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

于 2011-01-03T04:14:35.587 回答
30

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

但是,它在注释中说,

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

于 2011-01-03T04:28:16.443 回答
8

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

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

同样,像Intel 8048 系列这样的许多小型处理器的内存非常有限,以至于如果使用更多大约四个参数,大多数 C 和 C++ 编译器都会感到悲痛。尽管许多主流开发人员可能会对 8048 嗤之以鼻,但它的后代仍然是部署最广泛的 CPU 之一——主要用于嵌入式设备。

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

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

于 2011-01-03T05:31:44.683 回答
4

当然,如果您正在用 C 语言编写具有如此多参数的函数,您可能需要重新考虑程序的设计。

于 2011-01-03T04:19:04.353 回答