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