5

C 中定义的语句是否有最大长度?

编译器是 gcc

4

2 回答 2

10

该标准规定了最低翻译限制:

5.2.4.1 翻译限制

1 实现应能够翻译和执行至少一个程序,该程序至少包含以下每个限制的一个实例:

[...]

— 逻辑源行中的 4095 个字符

然而,该标准建议“实现应尽可能避免施加固定的翻译限制”。

逻辑源行是反斜杠换行符拼接的结果(5.1.1.2:1.2),因此这并不直接涵盖语句中字符数的最小限制。

但是,因为另一个翻译限制要求是:

— 字符串文字中的 4095 个字符(连接后)

并且由于字符串文字只能出现在语句中,因此实现必须接受至少一个 4095 字符的语句。

忽略文字,我们还看到:

— 一个函数调用中有 127 个参数

并且作为函数调用,每个参数必须包含至少 2 个字符,加上调用 ( f(0,0,...);) 的 4 个字符,我们得出的最小行长度限制为 260。

于 2012-07-23T14:40:47.500 回答
6

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 会阻止施加这样的限制。

说了这么多,我不想看到一个侵犯限制的声明。它最好是机器生成的,而不是人工编写的。

于 2012-07-23T14:46:56.940 回答