【问题标题】:Maximum number of parameters in function declaration函数声明中的最大参数个数
【发布时间】:2011-06-02 16:37:49
【问题描述】:

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

【问题讨论】:

  • 此类限制总是在您的编译器文档中定义。 IOW 您需要命名特定的编译器才能获得确切的数字。这些对于常见用途来说很大。一些编码策略建议不要使用超过 5 个参数的函数(比通常允许的要少)。

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


【解决方案1】:

是的,实施有限制。您的答案在以下 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 语句(不包括那些 任何嵌套的 switch 语句)[16 384]。
    — 单个数据成员 类、结构或联合 [16 384]。
    — 枚举常量 枚举[4 096]。
    — 级别 嵌套类、结构或联合 单一的定义 结构声明列表 [256]。
    — atexit()[32] 注册的函数。
    — 直接和间接基类 [16 384]。
    — a 的直接基类 单类[1024]。
    — 会员 在单个类中声明 [4 096]。
    — 最终覆盖虚函数 一类,可访问或不可访问 [16 384]。
    — 直接和间接虚拟基地 类 [1 024]。
    — a 的静态成员 类 [1 024]。
    — 朋友声明 在一类[4 096]。
    — 访问控制 类中的声明 [4 096]。
    — 构造函数中的成员初始化器 定义[6 144]。
    — 范围 一个标识符的资格 [256]。
    — 嵌套外部 规范 [1 024]。
    — 模板 模板声明中的参数 [1 024]。
    — 递归嵌套模板 实例化[17]。
    — 每个处理程序 尝试块 [256]。
    — 投掷 单一功能的规格 声明 [256]。

另外,它还写着 $18.3/6,

实施限制: 实施应支持 注册至少 32 个函数。

【讨论】:

  • 有在线标准的链接吗?
  • @Yttrill ANSI 和 ISO 通过出售标准副本来赚钱。它不是免费提供的;如果您需要该标准,您(或您的雇主)必须付费。但是,如果这足以满足您的目的,则可以使用预定稿草案。我不知道任何 C++ 草案,但可以通过谷歌搜索 n1256 找到 C 草案标准。
  • “对象的大小”究竟是什么意思?这是否包括封装的数据,还是仅仅是成员类型大小的总和(那里有很多 OF)?
【解决方案2】:

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) 实施应避免 施加固定的翻译限制 尽可能。

【讨论】:

【解决方案3】:

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

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

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

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

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

【讨论】:

    【解决方案4】:

    当然,如果您正在用 C 语言编写一个包含大量参数的函数,您可能需要重新考虑程序的设计。

    【讨论】:

    • 如果你正在编写一个有多个参数的 C++ 函数,你可能应该向委员会大喊让元组更易于使用:)
    • 这是最好的答案。最大值是“超过你应该使用的”。
    • 我出于好奇问了这个问题。
    • 一些可能接近这些限制的合法案例是框架、源混淆器以及其他一些。但是,用户永远不应该手写任何接近极限的东西,并且永远不必处理/看到这样的怪物。
    • 这应该是一条评论,因为它实际上并没有回答问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-23
    • 2016-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多