我正在考虑一些关于C编程语言的问题,并开始想知道inline
如何与递归交互。我制作了这个测试程序来找出答案。
static inline void f(void) {
f();
}
int main(void) {
f();
return 0;
}
我使用gcc
编译程序,根本没有收到任何警告
$ c99 -Wall -pedantic main.c -o a
我的问题是
C 标准对混合
inline
与递归有什么看法?
对我来说,不应该允许它似乎是合乎逻辑的。
引用标准:(§6.7.4 函数说明符,第 6 段)
使用内联函数说明符声明的函数是内联函数。使函数成为内联函数意味着对该函数的调用尽可能快。这些建议在多大程度上有效,由执行决定。
奇怪的是,该段落中没有提到内联函数;只是说调用应该很快。
编译器可以决定内联对函数的某些调用。例如,在递归内联函数中,编译器可以选择内联前k
递归调用,对于一些较小的k
值。(当然,无论如何它都可能决定这样做。不将函数声明为"内联"不会阻止编译器内联它。