今天在前輩的代碼中看到在頭文件中定義了static line函數,並且該函數只是判斷一個全局變量的狀態。
內聯代碼
//abc.c中定義了一個全局變量
uint8_t g_addrMode;
//abc.h中定義static line函數
extern uint8_t g_addrMode;
static inline bool CheckAddrMode(void)
{
return (g_addrMode != 0);
}
引入內聯函數的目的
爲了減少因函數調用而引起的系統開銷
內聯函數實際上是以空間換效率的一種做法。
以下面的例子爲例,如果main函數調用100次myprint( ),那麼會產生100次入棧和出棧操作,但實際上
myprint()只需要完成簡單的功能。
void main()
{
int i;
for(i=0;i<100;i++)
{
myprint();
}
}
void myprint()
{
printf("ok");
}
使用內聯函數的方式,可以寫成如下形式
void main()
{
int i;
for(i=0;i<100;i++)
{
myprint();
}
}
static inline void myprint()
{
printf("ok");
}
此時,等價於如下。如此,告訴編譯器把函數代碼在編譯時直接拷貝到程序中,而不是進行函數調用操作。
void main()
{
int i;
for(i=0;i<100;i++)
{
printf("ok");
}
}
注意事項
inline關鍵字
- 他可以向編譯器申請, 將使用inline修飾的函數內容, 內聯到函數調用的位置。如上述的printf(“ok”)直接內聯到main函數中。
- 只能對較小的函數起作用。內部不能有for循環之類的操作。
使用static的原因
函數在運行過程中也會分配內存, 但是由於static的存在, 因此就和修飾變量類似, 他只會開闢一塊內存空間。