在 gcc 编译的 c 程序中,表达式是否太长?

Can an expression be too long in a c program for gcc to compile?

假设我将一个很长的等式输入到单行 c 代码(.c 或 .h 文件)中,它有数千(也许数万)个字符长;例如

y = (2*(36*pow(x,2)*pow(A[n][j],5)*B[n][j]
  + (several thousand more such expressions) ) ;

(这里只取x为变量,A、B为双指针等)。在说 gcc 编译器无法正确编译代码之前,.c 或 .h 文件中的一行代码的长度是否有限制?我已经为#c 阅读了几个关于这个问题的相关讨论,但不仅仅是普通的 c。我从来没有从 gcc 收到任何关于我的代码行太长的错误,但我想特别确定这一点。

编辑: 为了回应下面的一些评论,我现在意识到我在问两个(我认为密切相关的)问题:

(1) 在 gcc 编译器可能造成 error/raise 错误之前,在 c 中一行的长度是否有任何限制?

(2) 在 gcc 编译器可能导致 error/raise 错误之前,表达式的复杂程度是否有任何限制? (例如,我们可以将很长的一行分成几行,但它们都是同一表达式的一部分)。

"how long a line of code can be in a .c or .h file " 的实际上限高度依赖于实现,但下限在标准中指定。根据 C11,§5.2.4.1

The implementation shall be able to translate and execute at least one program that contains at least one instance of every one of the following limits:

  • 4095 characters in a logical source line

也就是说,和一样,逻辑线和语句/表达式的复杂度(涉及操作/操作数的数量、操作类型、嵌套表达式等)不是一回事。也有单独的最小建议,例如

  • 63 nesting levels of parenthesized expressions within a full expression

  • 511 identifiers with block scope declared in one block

在计算复杂表达式的过程中,必须临时存储多个中间结果,理论上,它可能会耗尽系统中所有可用的堆栈 space,从而产生问题。在实践中,这真的很牵强,除非表达式太复杂以至于无法容纳在当今的多千兆计算系统中。


综上所述,您可能只需要编写一次这样的代码,即永远不会。正如我引用 M. Fowler 所说,

Any fool can write code that a computer can understand. Good programmers write code that humans can understand.

您问了两个不同的问题:一行的最大长度和表达式的复杂度。一个任意复杂的表达式可以很容易地分成多行——就像你在你的例子中所做的那样。

C 标准要求实现在逻辑源代码行中支持至少 4095 个字符。它表达该要求的方式相当间接。编译器必须能够处理一个达到所有指定限制的程序。基本原理是标准以精确和可测试的方式指定要求,但满足要求的最简单方法是完全避免强加任何固定限制。

详情见N1570 5.2.4.1,"Translation limits"。该部分中的相关限制是 63 个嵌套级别的括号和 127 个函数调用中的参数——但您可以创建任意复杂的表达式而不会达到这些限制中的任何一个。

该标准对表达式的复杂性没有具体限制。大多数编译器,包括 gcc,都会在处理源代码时动态分配资源(尤其是内存)。表达式的内部表示很可能是动态分配的树结构,而不是固定大小的数组。

您可能会构造一个 gcc 无法处理的过于复杂的表达式,并且它可能会通过在无法分配内存时打印致命错误消息或仅通过分段错误或类似的东西阻塞来响应。在具有千兆字节内存的现代计算机上,您需要 非常 大表达式才能触发此类故障。

除非您自动生成 C 代码并且您的生成器失控,否则您不会 运行 解决这个问题。