为什么__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,才能避免这个问题。

03-05 22:15