将声明为 "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 的一些较小值。 (当然,无论如何它都可能决定这样做。不声明函数“内联”并不会阻止编译器内联它。)