2014-09-22 33 views
0

鑑於內聯函數只是對編譯器的一個請求,我想知道是否有些編譯器可能會產生多個定義錯誤(如果內聯請求被拒絕),而其他編譯器可能不會如果內聯請求被接受)?頭文件中內聯自由函數的可移植性

如果是這樣,那麼是否最好將自由函數標記爲靜態而不是內聯函數,因爲這將保證每個TU都有自己的函數副本並避免編譯器特定的問題?

在此先感謝!

+0

沒有;即使構建工具選擇不內聯函數,但在完成所有工作時仍需創建一個定義。 – dlf 2014-09-22 15:12:41

回答

1

inline建議只適用於用實際定義替換函數調用的部分。 inline是以標準批准方式安全地繞過One定義規則的唯一方法。但它要求所有的函數定義是相同的。

良好閱讀:我的一個以前的答案:

Should I define static inline methods in header file?

2

它不是「唯一的請求」 - 在聯動效應,放寬一個定義規則,以允許在多個翻譯單位相同的定義,定義明確且便於攜帶。

這只是一個「請求」,它是由編譯器決定是否將調用內聯到任何函數,無論它們是否被聲明爲inline。與幾乎所有的優化一樣,「似乎」規則適用 - 程序行爲和正確性不能取決於是否應用了優化。

聲明它static不是一個好主意。最好的情況是,它會使程序具有多個相同的功能;在最壞的情況下,它將會破壞依賴於具有一致地址的函數的代碼,或者在翻譯單元之間共享靜態變量。