簡體   English   中英

為什么內聯函數需要傳遞參數?

[英]Why does an inline function need pass arguments?

內聯函數的一個定義是

如果函數是內聯的,編譯器會在編譯時調用該函數的每個點放置該函數的代碼副本。

那么我的問題是:為什么我們需要將參數傳遞給內聯函數?

例如

void main()
{
    int a = 10;
    print(a);
}

inline void print(int a)
{
    printf("%d",a);
}

根據上面的內聯定義,應該沒有編譯時錯誤,因為編譯器會將代碼轉換為以下內容:

void main()
{
    int a = 10;
    printf("%d",a);
}

你的結論是基於一個無效的前提。 內聯函數不是一種類似宏的設施,它盲目地將函數的代碼拼接到調用者的代碼中。 它們請求編譯器盡可能內聯函數體,但保持函數調用/執行的正常語義 換句話說,假設代碼是正確的,內聯和非內聯調用之間的行為(當然,處理器和內存使用除外)應該沒有可觀察到的差異。

內聯函數的這種定義允許它們的使用避免與宏相關的許多問題,例如在函數中定義的局部變量與調用者中的名稱相同的局部變量的沖突,或者對函數的調用在參數中產生副作用(例如print(a++)可以與內聯函​​數一起正常工作,但不能與宏一起使用)。

由於這種設計,您提供的示例是一個編譯時錯誤。

內聯函數是函數。 所以它們像函數一樣被編寫和管理。

編譯器可能會選擇以不同的方式處理這些函數(可能會更努力地內聯這些函數),但用戶界面仍然是函數。

此外,不能保證編譯器會遵守內聯請求。

如果你inline一個函數,它必須在使用它的每個翻譯單元中定義,並且無論編譯器是否可以內聯它都不會給出多個定義鏈接錯誤。

7.1.2 函數說明符 [dcl.fct.spec]

帶有內聯說明符的函數聲明 (8.3.5, 9.3, 11.3) 聲明了內聯函數。 內聯說明符向實現表明,在調用點函數體的內聯替換優先於通常的函數調用機制。 不需要實現在調用點執行此內聯替換; 然而,即使省略了這種內聯替換,7.1.2 中定義的內聯函數的其他規則仍應遵守。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM