?
Dieses Dokument verwendet PHP-Handbuch für chinesische Websites Freigeben
聲明一個(gè)內(nèi)聯(lián)函數(shù)。
inline function_declaration | (since C99) |
---|
inline
說(shuō)明符的目的是為編譯器提供執(zhí)行優(yōu)化的提示,例如函數(shù)內(nèi)聯(lián),它要求定義一個(gè)函數(shù)在調(diào)用站點(diǎn)上可見(jiàn)。inline
為了優(yōu)化目的,編譯器可以(并且通常)忽略指定符的存在與否。
如果編譯器執(zhí)行函數(shù)內(nèi)聯(lián),它將替換該函數(shù)的主體調(diào)用,從而避免函數(shù)調(diào)用的開(kāi)銷(xiāo)(將數(shù)據(jù)放在堆棧上并檢索結(jié)果),這可能會(huì)導(dǎo)致更大的可執(zhí)行文件,因?yàn)楹瘮?shù)的代碼具有要重復(fù)多次。結(jié)果與類(lèi)似函數(shù)的宏類(lèi)似,只是函數(shù)中使用的標(biāo)識(shí)符和宏引用定義時(shí)可見(jiàn)的定義,而不是調(diào)用點(diǎn)。
無(wú)論內(nèi)嵌是否發(fā)生,內(nèi)聯(lián)函數(shù)的以下語(yǔ)義都得到保證:
任何具有內(nèi)部連接的功能都可以聲明static inline
為沒(méi)有其他限制。
非靜態(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
不是外部可見(jiàn)的,并且不妨礙其他翻譯單元定義相同的功能。這使inline
關(guān)鍵字成為static
用于在頭文件內(nèi)定義函數(shù)的替代方法,其可能包含在同一程序的多個(gè)翻譯單元中。
如果函數(shù)inline
在某些翻譯單元中聲明,則不需要在任何地方聲明它:最多一個(gè)翻譯單元也可以提供常規(guī)的非內(nèi)聯(lián)非靜態(tài)函數(shù)或聲明的函數(shù)extern inline
。據(jù)說(shuō)這一個(gè)翻譯單元提供外部定義。如果在表達(dá)式中使用帶外部鏈接的函數(shù)的名稱,則程序中必須存在一個(gè)外部定義,請(qǐng)參閱一個(gè)定義規(guī)則。
如果外部定義存在于程序中,函數(shù)的地址總是外部函數(shù)的地址,但是當(dāng)使用該地址進(jìn)行函數(shù)調(diào)用時(shí),不指定內(nèi)聯(lián)定義(如果存在于翻譯單元中)還是在外部定義被調(diào)用。內(nèi)聯(lián)定義中定義的靜態(tài)對(duì)象不同于外部定義中定義的靜態(tài)對(duì)象:
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 程序不能取決于調(diào)用函數(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)