2012-03-01 75 views
2

C靜態內聯函數在運行時是否具有標識?靜態內聯函數的標識?

我應該關心該構造的命名衝突嗎?

如果函數定義在.c文件中?它是一樣的嗎?

回答

1

C靜態內聯函數在運行時是否具有身份?

如果編譯器至少選擇一次不內聯它,或者如果您取得該函數的地址,則靜態內聯函數在編譯單元中具有標識。

取得的地址僅在當前編譯單元(.c文件)中有效。在另一個編譯單元(另一個.c文件)中,編譯器會給你一個不同的地址。

與編譯器可見的任何其他函數一樣,函數中的代碼可能完全或部分複製到由編譯器生成的彙編代碼中的各個位置。

從當前編譯的.c文件中看不到任何其他.c文件中的靜態內聯函數(與任何靜態函數一樣)。

我應該關心該構造的命名衝突嗎?

只有當你需要在頭文件中定義的靜態內聯函數的地址,並執行以下操作:

  1. 靜態內聯函數f在文件a.h
  2. a.h定義爲C包括文件x.cy.c
  3. x.c需要的f並將其存儲在地址轉換成全局變量f_addr
  4. y.c需要的f的地址和用於身份,進行比較,以存儲在f_addr
  5. 所述比較將所述false的結果值儘管事實上在不同的抽象級別它是非常相同的功能f

如果函數是在.c文件中定義的?它是一樣的嗎?

從C編譯器的角度來看,它與在頭文件中定義函數和在.c文件中包含頭文件完全相同。編譯器不知道頭文件,它只看到一個連續的編譯單元。頭文件是使用C語言的程序員腦海中存在的概念 - 從C編譯器的角度來看,這個概念並不存在。

+0

最後一個問題的答案真的很好,謝謝! – Eonil 2012-03-01 15:15:15

2

內聯函數的命名與非內聯函數的命名一樣重要。該名稱由編譯器用於標識要調用的函數。程序員通過閱讀代碼也可以使用它來理解函數的作用。

在運行時,函數的名稱不相關。

還要注意的是inline關鍵字只有提示編譯器。儘管有inline關鍵字,該函數實際上可能不會內聯。同樣,未標記爲inline的函數可能仍由編譯器內聯。

1

您可能不在意命名內聯函數的衝突,但我保證編譯器會!

內聯是編譯期間的後期操作 - 編譯器首先需要確定程序的調用結構,這需要編譯器正確解析所有已命名的調用。

在運行時,你可以不知道任何當前正在執行的函數的名稱不明確編碼某種魔力,以確定它 - c反射

正如Mark指出的那樣,inline關鍵字只是一個提示 - 如果編譯器決定從顯式調用獲得更好的性能,編譯器可以自由忽略它。