将声明为 "inline" 的函数递归是否合法?
Is it legal to for a function declared "inline" to be recursive?
我稍微考虑了一下 C 编程语言,并开始想知道 inline
如何与递归交互。我做了这个测试程序来一探究竟。
static inline void f(void) {
f();
}
int main(void) {
f();
return 0;
}
我使用 gcc
编译程序,完全没有收到任何警告
$ c99 -Wall -pedantic main.c -o a
我的问题是
What does the C standards say about mixing inline
with recursion?
对我来说,这似乎是合乎逻辑的。
引用标准:(§6.7.4 函数说明符,第 6 段)
A function declared with an inline function specifier is an inline function. Making a function an inline function suggests that calls to the function be as fast as possible. The extent to which such suggestions are effective is implementation-defined.
奇怪的是,该段中没有任何关于内联内联函数的内容;只是调用应该很快。
编译器可以决定内联 一些 函数调用。例如,在递归内联函数中,编译器可能会选择内联前 k
个递归调用,以获得 k
的一些较小值。 (当然,无论如何它都可能决定这样做。不声明函数“内联”并不会阻止编译器内联它。)
我稍微考虑了一下 C 编程语言,并开始想知道 inline
如何与递归交互。我做了这个测试程序来一探究竟。
static inline void f(void) {
f();
}
int main(void) {
f();
return 0;
}
我使用 gcc
编译程序,完全没有收到任何警告
$ c99 -Wall -pedantic main.c -o a
我的问题是
What does the C standards say about mixing
inline
with recursion?
对我来说,这似乎是合乎逻辑的。
引用标准:(§6.7.4 函数说明符,第 6 段)
A function declared with an inline function specifier is an inline function. Making a function an inline function suggests that calls to the function be as fast as possible. The extent to which such suggestions are effective is implementation-defined.
奇怪的是,该段中没有任何关于内联内联函数的内容;只是调用应该很快。
编译器可以决定内联 一些 函数调用。例如,在递归内联函数中,编译器可能会选择内联前 k
个递归调用,以获得 k
的一些较小值。 (当然,无论如何它都可能决定这样做。不声明函数“内联”并不会阻止编译器内联它。)