|
1
|
| Chi_Iroh Chris Dodd · 技术社区 · 2 年前 |
|
|
1
2
对 C99的主要相关规定如下:
(C99 6.7.5.2/1-2) 请注意,指定数组大小(如果存在)的表达式的构成的唯一约束是它具有整数类型。使用上下文对所涉及的运算符或操作数没有其他要求。
(C99 6.7.5.2/4-5)
请注意,最后一句话不适用于您的特定情况;我把它包括在内是为了完整性,因为它确实涉及混合
这里唯一的附加要求是该值大于0,但对于总是如此
对 C99的主要相关规定如下:
(C99 6.7/4) 请注意,可以考虑同一函数的多个声明。
(C99 6.7.5.3/15) 请特别注意,参数类型的比较使用 已调整 类型这是指 将参数声明为“类型的数组”应调整为“指向类型的合格指针”,其中类型限定符(如果有)是在数组类型派生的[和]中指定的限定符。 (C99 6.7.5.3/7)
这种调整使你的
这取决于情况。 C99不允许调用未声明的函数(尽管许多编译器接受这些函数作为向后兼容性扩展),并且函数标识符在声明完成后才在作用域中。因此,函数声明中的表达式不能调用该函数,除非前面有同一函数的另一个声明。通常情况并非如此,但您的示例会注意提供它。 否则,如前所述,VLA中大小表达式形式的唯一限制是它具有整数类型。这不受VLA声明出现的上下文的限制。
不 这里的主要规定是 对一致性实施的最低要求是: [...]
[...] (C99 5.1.2.3/5)
这是关于总体上可以执行哪些优化的主要规定。假设我们进行解释
不 即使编译器将其实现为递归,语言规范也没有说明堆栈或堆栈溢出。这坚定地体现在实施细节方面。 此外,即使在使用调用堆栈的实现上,因此很容易受到堆栈溢出的影响,编译器也可以在这种特殊情况下通过观察它 尾 递归,因此每个递归调用都可以重用相同的堆栈帧。 |
|
|
2
1
当然当声明VLA时,大小可以是任何表达式。没有理由
相当于
对在声明中,它们是等价的。
在声明之后的任何时候都可以调用该函数。所以你只需要一个正向声明,就像你需要一个在调用它的函数之后定义的函数一样。
如果优化器能够确定它不会改变定义良好的结果,那么它就可以对其进行优化。如果实际递归会导致无限递归,并且优化器可以确定这一点,那么它可以对其进行优化,因为它可以假设不会有任何未定义的行为。 |
|
3
1
规范中有一条规定:
(§ 6.7.5.2.5) 这意味着您的代码示例等效于
并且根本不应该评估大小中的表达式。然而,gcc似乎并不符合这一点。 |
|
|
MaPo · Linux,设置锁定ICMP_过滤器选项 1 年前 |
|
Doohyeon Won · 内联函数上的奇怪现象?[关闭] 1 年前 |
|
|
Bobby · 复合字面值总是左值吗? 1 年前 |
|
9-Pin · C: 嵌套结构的堆栈内存分配 1 年前 |