Jus*_*tin 3 c gcc limits compiler-errors
假设我将一个非常长的等式输入到单行c代码(.c或.h文件)中,该代码长达数千(可能是数万)字符; 例如
y = (2*(36*pow(x,2)*pow(A[n][j],5)*B[n][j]
+ (several thousand more such expressions) ) ;
Run Code Online (Sandbox Code Playgroud)
(这里只是将x作为变量,A,B作为双指针等).在说gcc编译器无法正确编译代码之前,.c或.h文件中的代码行有多长?我已经为#c阅读了几个关于这个问题的相关讨论,但不仅仅是简单的c.我从来没有从gcc中收到任何关于我的代码中包含太长行的错误,但我想对这一点更加确定.
编辑:在回应下面的一些评论时,我现在意识到我问了两个(我认为密切相关的)问题:
(1)在gcc编译器可能发生错误/引发错误之前,行中c可以有多长时间有限制吗?
(2)在gcc编译器可能发生错误/引发错误之前,表达式的复杂程度是否有限制?(例如,我们可以将很长的一行分成几行,但它们都是同一个表达式的一部分).
"代码行可以在.c或.h文件中保存多长时间"的实际上限取决于高度实现,但下限在标准中指定.根据C11§5.2.4.1
该实现应能够翻译和执行至少一个包含以下每个限制的至少一个实例的程序:
- 逻辑源行中的4095个字符
也就是说,正如Keith在其他答案中提到的那样,逻辑行和语句/表达式的复杂性(涉及操作/操作数的数量,操作类型,嵌套表达式等)都不是一回事.也有单独的最小建议,比如
63个完整表达式中带括号的表达式的嵌套级别
在一个块中声明具有块作用域的511个标识符
等等
在计算复杂表达式的过程中,必须临时存储多个中间结果,理论上,它可能会占用系统中所有可用的堆栈空间,从而产生问题.在实践中,除非表达如此复杂以至于无法在当今的多工作计算系统中实现,否则这是非常牵强的.
尽管如此,你可能只需要编写一次这样的代码,这是永远不会的.正如M.福勒和我引述的那样,
任何傻瓜都可以编写计算机可以理解的代码.优秀的程序员编写人类可以理解的代码.
你已经问过两个不同的东西:一条线的最大长度,以及一个表达式的复杂性.任意复杂的表达式可以很容易地分成多行 - 正如您在示例中所做的那样.
C标准要求实现在逻辑源行中支持至少4095个字符.它表达这种要求的方式是相当间接的.编译器必须能够处理一个达到所有指定限制的程序.理由是标准以精确和可测试的方式规定了要求,但满足要求的最简单方法是避免施加任何固定限制.
详情见N1570 5.2.4.1,"翻译限制".该部分中的相关限制是括号中的63个嵌套级别和函数调用中的127个参数 - 但是您可以创建任意复杂的表达式而不会达到其中任何一个限制.
该标准对表达式的复杂性没有特定限制.大多数编译器(包括gcc)将在处理源代码时动态分配资源(特别是内存).表达式的内部表示可能是动态分配的树结构,而不是固定大小的数组.
您可以构造一个对于gcc来说太复杂的表达式,并且它可能通过在无法分配内存时打印致命错误消息或者仅通过分段故障或类似情况进行阻塞来响应.在具有千兆字节内存的现代计算机上,您需要一个非常大的表达式来触发此类故障.
除非您自动生成C代码,否则您不会遇到此问题,并且您的生成器失控.