簡體   English   中英

為什么我必須在這里明確聲明內聯函數?

[英]Why do I explicitly have to declare functions inline here?

好的,到目前為止,我認為在 header 文件中定義的函數被視為內聯函數,就像模板一樣,定義一次,等等。

我也使用包含保護,但我仍然遇到多個已定義對象的 linker 錯誤,我知道這是因為所有這些不同的單元都在復制東西,linker 試圖找出哪個項目是正確的。

我也知道 inline 只是一個建議,甚至可能不會被編譯器使用,等等。

然而,我必須在我編寫的僅 header 的小工具集中明確定義所有這些小功能。

即使函數很大,我也必須內聯聲明它們,編譯器仍然可能會忽略提示。

然而,無論如何我必須這樣定義它們。

例子:

#ifndef texture_math_h__
#define texture_math_h__

float TexcoordToPixel(float coord, float dimension)
{
    return coord * dimension;
}

float PixelToTexcoord(float pixel, float dimension)
{
    return pixel / dimension;
}

float RecalcTexcoord(float coord,float oldDimension, float newDimension)
{
    return PixelToTexcoord(TexcoordToPixel(coord,oldDimension),newDimension);
}
#endif // texture_math_h__

對於包含該文件的每個單元,錯誤是,blabla 已經在 xxx.obj 中定義

當我聲明所有這些內聯時,它會正確鏈接。

這是什么原因? 這不是一個大問題,哎呀,優化可能也可以在 cpp 中找到,對吧?

我只是對這里的原因感到好奇,希望這不是太多的重復,並感謝您的寶貴時間。

包含防護僅防止代碼在同一個翻譯單元中包含兩次。 因此,如果您有多個文件包含相同的 header,則該代碼將被包含多次。 Functions defined in a header are not inline by default, so this will give you linker errors - you need to define those function with the inline keyword, unless they are member functions of a class.

另外,請注意包含雙下划線的名稱是為 C++ 實現的目的而保留的 - 您不得在自己的代碼中創建此類名稱。

成員函數可能是內聯的——你不能強制內聯。 - 如果 (a) 它們在 class 中定義,或者 (b) 您在定義中使用內聯子句。 請注意,如果您使用的是內聯子句,則不應在 header 中定義 function - 唯一的例外是模板,因為它們是“特殊的”。
正如您剛剛更新的問題:
這個 header 的每個用戶都會有一個函數定義 -> 多個定義。 你需要分開定義和聲明!

這都是關於單一定義規則的。 這表明您在 C++ 程序中的每個非內聯 function(以及各種其他類型的實體)只能有一個定義,您鏈接到該程序的所有翻譯單元中。

將 function 標記為inline聯會啟用通常的定義規則的例外。 它聲明(解釋)您可以對每個翻譯單元有一個內聯 function 的定義,前提是所有定義都匹配,並且在使用內聯 function 的每個翻譯中都提供了一個定義。

包含保護將通過多次包含包含定義的 header 文件來防止您意外地為每個翻譯單元提供多個定義。

為了滿足非內聯 function 的一個定義規則,您仍然必須確保只有一個翻譯單元包含 function 定義。 通常的方法是僅在 header 文件中聲明函數並擁有一個包含定義的源文件。

暫無
暫無

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

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