为什么__INLINE 一般要加static
原因如下:
开发者决定不了一个函数是否被内联,开发者只有建议权,只有编译器具有决定权。
下面,我们来看看一个被static inline修饰的非内联函数:
static __inline int Fake_StaticInline_Add(int n1,int n2,int n3,int n4,int n5)
{
/只是为了多凑几条指令/
n1++;n1++;n1++;n1++;n1++;n1++;n1++;n1++;n1++;n1++;n1++;
return (n1+n2+n3+n4+n5);;
}
这个函数我们把他放在main.c中,并在main函数这样调用:i = Fake_StaticInline_Add(6,6,6,6,6);。现在我们来看看他的反汇编代码:
MOVS r0,#5
MOV r3,r0
MOV r2,r0
MOV r1,r0
STR r0,[sp,#0]
BL Fake_StaticInline_Add
MOV r4,r0
NOP
惊不惊喜,意不意外? 这个函数居然是被调用了的,而并没有被内联到调用它的地方。那么,为什么这个函数没变成内联函数呢?
我推断是因为我在这个函数中写入了太多指令,编译器判断如果它变成内联函数,会极大占用空间,所以不将它编译成内联函数。
但你还记得我们之前把Inline_Add函数放在哪里吗?放在了一个头文件。试想,如果这个Inline_Add在没有被编译成内联函数的情况下,被include到了多个源文件中,势必会产生函数重复定义的问题。 因此,我们要再加一个关键字static,才能避免这个问题。