首页 > 解决方案 > 在 C 中相互调用的 2 个内联函数的行为

问题描述

我正在尝试学习 C 的更高级方面,并在试验__inline__关键字时写了这个:

#include <stdio.h>


void f(int);
void g(int);


__inline__ void f(int egg)
{
    printf("f %d\n", egg);
    g(egg);
}


__inline__ void g(int egg)
{
    printf("g %d\n", egg);
    f(egg);
}


int main()
{
    f(123);

    return 0;
}

我查看了 GNU 手册,发现当标记的函数无法替换时,-Winline编译器选项会发出警告。__inline__

我确实期待一个警告,但我编译了这个程序gcc -ansi -pedantic -Wall -Wextra -Winline -o test test.c并且没有警告。

当我运行该程序时,它在分段错误之前打印了很多次该数字,大概是由于超出了递归限制。

我的问题是,gcc在这种情况下表现如何?如果它确实内联了函​​数,它如何知道它在两个函数之间进行了递归调用?

先感谢您

标签: cgccinline

解决方案


https://gcc.gnu.org/onlinedocs/gcc-7.4.0/gcc/Inline.html#Inline

GCC 在不优化时不会内联任何函数,除非您为函数指定“always_inline”属性

由于您在没有优化的情况下进行编译,gcc 甚至不会尝试内联您的函数,因此您不会收到未完成的警告。

当我用 编译您的代码时-O -Winline,我收到了预期的警告:

inline.c: In function ‘main’:
inline.c:8:17: warning: inlining failed in call to ‘f’: call is unlikely and code size would grow [-Winline]
 __inline__ void f(int egg)
                 ^
inline.c:24:5: note: called from here
     f(123);
     ^~~~~~

推荐阅读