?
? ????? PHP ??? ???? ??? ?? ??
聲明一個內(nèi)聯(lián)函數(shù)。
inline function_declaration | (since C99) |
---|
inline
說明符的目的是為編譯器提供執(zhí)行優(yōu)化的提示,例如函數(shù)內(nèi)聯(lián),它要求定義一個函數(shù)在調用站點上可見。inline
為了優(yōu)化目的,編譯器可以(并且通常)忽略指定符的存在與否。
如果編譯器執(zhí)行函數(shù)內(nèi)聯(lián),它將替換該函數(shù)的主體調用,從而避免函數(shù)調用的開銷(將數(shù)據(jù)放在堆棧上并檢索結果),這可能會導致更大的可執(zhí)行文件,因為函數(shù)的代碼具有要重復多次。結果與類似函數(shù)的宏類似,只是函數(shù)中使用的標識符和宏引用定義時可見的定義,而不是調用點。
無論內(nèi)嵌是否發(fā)生,內(nèi)聯(lián)函數(shù)的以下語義都得到保證:
任何具有內(nèi)部連接的功能都可以聲明static inline
為沒有其他限制。
非靜態(tài)內(nèi)聯(lián)函數(shù)不能定義非 const 函數(shù) - 局部靜態(tài),并且不能引用文件范圍靜態(tài)。
static int x;inline void f(void){ static int n = 1; // error: non-const static in a non-static inline function int k = x; // error: non-static inline function accesses a static variable}
如果聲明了非靜態(tài)函數(shù)inline
,那么它必須在相同的翻譯單元中定義。不使用的內(nèi)聯(lián)定義extern
不是外部可見的,并且不妨礙其他翻譯單元定義相同的功能。這使inline
關鍵字成為static
用于在頭文件內(nèi)定義函數(shù)的替代方法,其可能包含在同一程序的多個翻譯單元中。
如果函數(shù)inline
在某些翻譯單元中聲明,則不需要在任何地方聲明它:最多一個翻譯單元也可以提供常規(guī)的非內(nèi)聯(lián)非靜態(tài)函數(shù)或聲明的函數(shù)extern inline
。據(jù)說這一個翻譯單元提供外部定義。如果在表達式中使用帶外部鏈接的函數(shù)的名稱,則程序中必須存在一個外部定義,請參閱一個定義規(guī)則。
如果外部定義存在于程序中,函數(shù)的地址總是外部函數(shù)的地址,但是當使用該地址進行函數(shù)調用時,不指定內(nèi)聯(lián)定義(如果存在于翻譯單元中)還是在外部定義被調用。內(nèi)聯(lián)定義中定義的靜態(tài)對象不同于外部定義中定義的靜態(tài)對象:
inline const char *saddr(void) // the inline definition for use in this file{ static const char name[] = "saddr"; return name;}int compare_name(void){ return saddr() == saddr(); // unspecified behavior, one call could be external}extern const char *saddr(void); // an external definition is generated, too
有效的 C 程序不能取決于調用函數(shù)的內(nèi)聯(lián)版本還是外部版本。
inline
.
// file test.h#ifndef TEST_H_INCLUDED #define TEST_H_INCLUDED inline int sum (int a, int b){ return a+b;}#endif // file sum.c#include "test.h"extern inline int sum (int a, int b); // provides external definition // file test1.c#include <stdio.h>#include "test.h"extern int f(void); int main(void){ printf("%d\n", sum(1, 2) + f());} // file test2.c#include "test.h" int f(void){ return sum(2, 3);}
輸出:
8
C11 standard (ISO/IEC 9899:2011):
6.7.4 Function specifiers (p: 125-127)
C99 standard (ISO/IEC 9899:1999):
6.7.4 Function specifiers (p: 112-113)