C 中定义的语句是否有最大长度?
编译器是 gcc
该标准规定了最低翻译限制:
5.2.4.1 翻译限制
1 实现应能够翻译和执行至少一个程序,该程序至少包含以下每个限制的一个实例:
[...]
— 逻辑源行中的 4095 个字符
然而,该标准建议“实现应尽可能避免施加固定的翻译限制”。
逻辑源行是反斜杠换行符拼接的结果(5.1.1.2:1.2),因此这并不直接涵盖语句中字符数的最小限制。
但是,因为另一个翻译限制要求是:
— 字符串文字中的 4095 个字符(连接后)
并且由于字符串文字只能出现在语句中,因此实现必须接受至少一个 4095 字符的语句。
忽略文字,我们还看到:
— 一个函数调用中有 127 个参数
并且作为函数调用,每个参数必须包含至少 2 个字符,加上调用 ( f(0,0,...);
) 的 4 个字符,我们得出的最小行长度限制为 260。
C 标准规定了编译器必须接受的语言复杂性的各种下限,但对语句本身的长度没有限制。
§5.2.4.1 翻译限制
实现应能够翻译和执行至少一个程序,该程序包含以下每个限制的至少一个实例:18)
- 127个嵌套级别的块
- 63 个嵌套级别的条件包含
- 12 个指针、数组和函数声明符(任意组合),用于修改声明中的算术、结构、联合或 void 类型
- 一个完整的声明符内有 63 个嵌套级别的括号声明符
- 完整表达式中的 63 个括号表达式嵌套级别
- 内部标识符或宏名称中的 63 个有效初始字符(每个通用字符名称或扩展源字符都被视为单个字符)
- 外部标识符中的 31 个有效初始字符(每个指定短标识符为 0000FFFF 或更少的通用字符名称被视为 6 个字符,每个指定短标识符为 00010000 或更大的通用字符名称被视为 10 个字符,每个扩展源字符被视为与相应的通用字符名称相同的字符数,如果有的话)19)
- 一个翻译单元中有 4095 个外部标识符
- 在一个块中声明了 511 个具有块范围的标识符
- 在一个预处理翻译单元中同时定义 4095 个宏标识符
- 1 个函数定义中的 127 个参数
- 一个函数调用中有 127 个参数
- 一个宏定义127个参数
- 一次宏调用中有 127 个参数
- 逻辑源代码行中有 4095 个字符
- 字符串文字中的 4095 个字符(连接后)
- 对象中的 65535 字节(仅在托管环境中)
- #included 文件的 15 个嵌套级别
- switch 语句的 1023 个 case 标签(不包括任何嵌套 switch 语句的标签)
- 1023 个成员在一个单一的结构或工会中
- 单个枚举中有 1023 个枚举常量
- 单个 struct-declaration-list 中的 63 级嵌套结构或联合定义
18)实施应尽可能避免施加固定的翻译限制。
19)见“未来语言方向”(6.11.3)。
§6.11.3 外部名称
将外部名称的重要性限制为少于 255 个字符(将每个通用字符名称或扩展源字符视为单个字符)是一个过时的功能,它是对现有实现的让步。
正如你所看到的,脚注 18 会阻止施加这样的限制。
说了这么多,我不想看到一个侵犯限制的声明。它最好是机器生成的,而不是人工编写的。