#include“ another_source.c”,在那里使用内联函数(),然后该函数()也变为内联吗?

时间:2018-10-13 08:48:20

标签: c inline extern

比方说,我有两个名为“ AA.c”,“ BB.c”的文件

/* in AA.c */

inline void AA(void) __attribute__((always_inline));
void AA()
{
    /* do something */
}

然后

/* in BB.c */
#include "AA.c"

extern void funcAA(void);
int main(void)
{
    funcAA();

    return 0;
}

funcAA()是否也可以内联??

无论答案是是还是否,您能否进一步解释一下发动机罩?

1 个答案:

答案 0 :(得分:3)

包含.c文件等同于直接在包含文件的文件中复制和粘贴文件内容,就像该函数直接在包含文件中定义一样。

通过尝试使用-E标志(预处理器输出)来编译文件,可以看到编译器将要编译的内容。您会看到粘贴的函数。

因此,仅由于inline关键字而将其内联,并强制使用always_inline属性,即使编译器由于例如函数大小而拒绝对其进行内联。

建议:知道包含另一个.c文件时您在做什么。一些构建系统/ makefile只是扫描目录以查找名为*.c的文件,以便它们可以分别编译。将可能未编译的C文件放在此处可能会使构建失败,并且如果构建该文件,则链接时可能会有重复的符号。只是不要这样做。

如果要执行此操作,请将函数放入.h文件中并声明为static,这样,如果许多.c文件中都包含链接,它就不会失败(每个函数都会被看到不同)