#include "another_source.c",在那里使用 inline function( ),那么 function( ) 是否也变成 inline 了?
#include "another_source.c", use inline function( ) there, then does the function( ) become inline as well?
假设我有两个名为 "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( ) 是否也变为内联???
无论答案是是还是否,您能否解释一下幕后的更多信息??
包含 .c 文件等同于将文件内容直接复制并粘贴到包含该文件的文件中,就像函数直接定义在包含文件中一样。
您可以通过尝试使用 -E
标志(预处理器输出)编译您的文件来查看编译器将要编译的内容。您会看到您的函数已粘贴。
所以它将内联只是因为 inline
关键字,并且强制使用 always_inline
属性,即使编译器会因为函数大小而拒绝内联它。
忠告:当包含来自另一个文件的 .c
文件时,知道自己在做什么。一些构建 systems/makefiles 只是扫描目录寻找名为 *.c
的文件,这样他们就可以单独编译它们。将可能未编译的 C 文件放在那里可能会导致构建失败,如果构建成功,则在 linking 时可能会出现重复的符号。只是不要这样做。
如果你想这样做,把你的函数放在一个 .h
文件中并声明它 static
这样如果包含在许多 .c 文件中它就不会失败 link (每个功能都会被视为不同)
假设我有两个名为 "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( ) 是否也变为内联???
无论答案是是还是否,您能否解释一下幕后的更多信息??
包含 .c 文件等同于将文件内容直接复制并粘贴到包含该文件的文件中,就像函数直接定义在包含文件中一样。
您可以通过尝试使用 -E
标志(预处理器输出)编译您的文件来查看编译器将要编译的内容。您会看到您的函数已粘贴。
所以它将内联只是因为 inline
关键字,并且强制使用 always_inline
属性,即使编译器会因为函数大小而拒绝内联它。
忠告:当包含来自另一个文件的 .c
文件时,知道自己在做什么。一些构建 systems/makefiles 只是扫描目录寻找名为 *.c
的文件,这样他们就可以单独编译它们。将可能未编译的 C 文件放在那里可能会导致构建失败,如果构建成功,则在 linking 时可能会出现重复的符号。只是不要这样做。
如果你想这样做,把你的函数放在一个 .h
文件中并声明它 static
这样如果包含在许多 .c 文件中它就不会失败 link (每个功能都会被视为不同)