gpt4 book ai didi

c - 2个内联函数在C中相互调用的行为

转载 作者:太空狗 更新时间:2023-10-29 16:00:14 25 4
gpt4 key购买 nike

我正在尝试学习 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 手册,发现当标记为 __inline__ 的函数无法被替换时,-Winline 编译器选项会发出警告。

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

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

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

提前致谢

最佳答案

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

GCC does not inline any functions when not optimizing unless you specify the ‘always_inline’ attribute for the function

由于您是在未经优化的情况下进行编译,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);
^~~~~~

关于c - 2个内联函数在C中相互调用的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55575606/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com