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

c程序中的表达式是否太长,gcc无法编译?,c,gcc,compiler-errors,limits,C,Gcc,Compiler Errors,Limits,比方说,我在一行长达数千(可能数万)个字符的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。我从来没有收到过gc

比方说,我在一行长达数千(可能数万)个字符的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编译器可能发生错误/引发错误之前,一行在c中的长度是否有任何限制


(2) 在gcc编译器可能出现错误/引发错误之前,表达式的复杂程度是否有任何限制?(例如,我们可以把一条很长的线分成几行,但这都是同一表达式的一部分)

实际的“代码行在.c或.h文件中的长度”上限高度依赖于实现,但下限在标准中有规定。根据
C11
,§5.2.4.1

实施应能够翻译和执行至少一个 至少包含以下每个限制的一个实例:

  • 逻辑源行中有4095个字符
也就是说,语句/表达式的逻辑行和复杂性(涉及的操作数/操作数、操作类型、嵌套表达式等)不是一回事。也有单独的最低限度建议,如

  • 63完整表达式中括号表达式的嵌套级别

  • 511在一个块中声明块作用域的标识符

等等

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


综上所述,您可能只需要编写一次这样的代码,也就是说,永远不。正如福勒先生和我所说

任何傻瓜都能写出计算机能理解的代码。好 程序员编写人类能够理解的代码


您已经询问了两个不同的问题:行的最大长度和表达式的复杂性。任意复杂的表达式可以很容易地跨多行拆分——就像您在示例中所做的那样

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

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

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

您可能会构造一个gcc无法处理的过于复杂的表达式,当它无法分配内存时,它可能会打印一条致命的错误消息,或者只是被分段错误或类似的错误阻塞。在一台拥有千兆字节内存的现代计算机上,您需要一个非常大的表达式来触发这种故障


除非您自动生成C代码,并且生成器失控,否则您不会遇到此问题。

您可以试试。但我不确定你是否想做这么长的表达。试试看,C。我的意思是看。写一个长方程式。然后复制它并将其添加到自身。然后复制它并将其添加到自身中。然后复制所有这些并将其添加到自身中。。。当然,不管gcc是否能够处理它,结果将完全不可维护,因此应该将其分解为组件部分。不要忘记,一个复杂的表达式在运行时可能需要大量堆栈空间来存储中间值。您提到的“一行c代码”,但是你的例子分成两行。您是在问代码行的长度限制,还是表达式的复杂性限制?中的讨论表明,您可能遇到的第一个限制是单个对象文件中可以打包多少机器代码!逻辑源代码行中字符数的限制与问题无关,因为表达式可以按您喜欢的行数拆分。编辑:在更仔细的阅读中,我看到问题确实提到了行长度,但示例将表达式拆分为两行。我已要求OP澄清。@KeithThompson绝对!!我添加了一个注释,但您已经详细介绍了。