函数声明中的最大参数个数
Posted
技术标签:
【中文标题】函数声明中的最大参数个数【英文标题】:Maximum number of parameters in function declaration 【发布时间】:2011-06-02 16:37:49 【问题描述】:我知道函数定义中的最小参数数量为零,但是函数定义中的最大参数数量是多少?我问这个问题只是为了知识和好奇,而不是我要写一个真正的函数。
【问题讨论】:
此类限制总是在您的编译器文档中定义。 IOW 您需要命名特定的编译器才能获得确切的数字。这些对于常见用途来说很大。一些编码策略建议不要使用超过 5 个参数的函数(比通常允许的要少)。 【参考方案1】:是的,实施有限制。您的答案在以下 C++ 标准摘录中的粗体文本中给出。
1。 C++语言
附件 B - 实施数量
由于计算机是有限的,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]。 — 级别 嵌套类、结构或联合 单一的定义 结构声明列表 [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) 实施应避免 施加固定的翻译限制 尽可能。
【讨论】:
你有这个文档的链接吗? @Mr.32:谷歌搜索C language standard n1256
。在搜索时,我得到了这个链接:open-std.org/jtc1/sc22/wg14/www/docs/n1256.pdf【参考方案3】:
正如之前的回答者已经充分指出的那样,参数的数量取决于 C++ 编译器。编译器的限制很可能是由于硬件环境的限制。
例如,VAX CPU architecture 使用一个 8 位字段来保存参数的数量,因此兼容的 VAX 代码不能传递超过 255 个参数。
同样,像Intel 8048 family 这样的许多小型处理器的内存非常有限,以至于如果使用更多大约四个参数,大多数 C 和 C++ 编译器都会感到悲痛。尽管许多主流开发人员可能会对 8048 嗤之以鼻,但它的后代仍然是部署最广泛的 CPU 之一——主要用于嵌入式设备。
许多 RISC 架构实现指定使用寄存器而不是堆栈的参数传递方法。例如,一个基本的 ARM CPU 只有 16 个寄存器。参数的最大数量很可能取决于编译器命令行选项,这些选项会影响它生成代码以传递参数的方式。可能超过八个被压入堆栈。也许不会。
如果这些示例看起来过于严格,请考虑将 Palm OS limited 视为单个参数的 C 函数,并且必须为 int
或 void *
类型。
【讨论】:
【参考方案4】:当然,如果您正在用 C 语言编写一个包含大量参数的函数,您可能需要重新考虑程序的设计。
【讨论】:
如果你正在编写一个有多个参数的 C++ 函数,你可能应该向委员会大喊让元组更易于使用:) 这是最好的答案。最大值是“超过你应该使用的”。 我出于好奇问了这个问题。 一些可能接近这些限制的合法案例是框架、源混淆器以及其他一些。但是,用户永远不应该手写任何接近极限的东西,并且永远不必处理/看到这样的怪物。 这应该是一条评论,因为它实际上并没有回答问题。以上是关于函数声明中的最大参数个数的主要内容,如果未能解决你的问题,请参考以下文章