c - 在 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
在这种情况下表现如何?如果它确实内联了函数,它如何知道它在两个函数之间进行了递归调用?
先感谢您
解决方案
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);
^~~~~~
推荐阅读
- progressive-web-apps - 如何从其他原生应用打开我的 PWA 应用?
- solr - 应用架构文件谜题后缺少 2 个字段
- java - 应用程序窗口错误“插件“org.eclipse.wb.core.ui”无法实例化类”
- javascript - 我如何在 LokiJS DB 中创建索引?
- android-studio - Android Studio - 视频奖励有效,但没有更多回调 - 可能出现故障?
- microsoft-graph-api - Graph API - 我如何确定链接的联系人?
- docusignapi - 退回的文件缺少签名
- firebase - 以编程方式添加 Videoview
- wordpress - Wordpress - 自定义分类法不适用于永久链接 - 404
- linux - 从 bash shell 脚本中的整个字符串中提取路径