GCC环境下如何强制调用函数的external definition而非inline定义?
可用的解决方案
- 使用
-fno-inline编译选项:
该选项会全局禁用gcc对inline函数的优先调用逻辑,忽略所有翻译单元内的inline声明,直接链接外部定义的函数版本。编译命令如下:
编译后运行程序,输出将为gcc -fno-inline main.c foo.c -o testTest external definition。 - 针对单个函数禁用内联:
不需要全局修改编译规则时,可给main.c内的inline函数添加__attribute__((noinline))属性,修改后的代码如下:
该属性会告知gcc不要优先使用当前翻译单元的inline定义,自动链接其他翻译单元的external definition。#include <stdio.h> inline __attribute__((noinline)) void foo(void){ printf("Test\n"); } int main(void){ foo(); } - 额外说明:
gcc不同编译标准下inline的行为存在差异,默认gnu89标准中inline规则与C99及之后的标准不同,指定-std=gnu89编译也会触发优先调用外部定义的逻辑,但该方法可控性较低,更推荐使用前两种方案。
内容的提问来源于stack exchange,提问作者Some Name
相关产品推荐
相关产品推荐

