2012-07-18 87 views
7

我開始使用第三方庫進行一些工作,並且在Visual Studio 2010中構建它時,我注意到我多次收到此鏈接程序警告(LNK4221)。我查看了創建被鏈接的對象文件時使用的源代碼,發現這些文件的所有實現都位於頭文件中。有趣的是,我還注意到該項目包含相應的.cpp文件,其中包含,只有#頭文件包含實現。僅包含一個#include的.cpp文件的要點是什麼?

我很好奇 - 這是什麼意思,爲什麼我要使用這種技術?如果.cpp文件沒有爲該項目添加任何值,爲什麼我不應該刪除它們以擺脫鏈接器警告?

我試過尋找類似的問題,但沒有找到任何感興趣的東西。如果你知道任何,請鏈接它們。

+0

這是一個警告,而不是一個錯誤。 – 2012-07-18 15:49:33

+0

是的,我知道。我比使用僅包含一個#include的.cpp文件的技術更少關心警告。 – 2012-07-18 15:51:54

+2

兩種可能的動機:1 - 可能被認爲總是擁有'.h' /'.cpp'對的良好習慣。也許作者認爲他們稍後會加入'.cpp'。 2 - '.h'文件不能被編譯成目標文件,'.cpp'文件可以。 – BoBTFish 2012-07-18 16:01:46

回答

1

我正在使用它來確保頭部至少包含在第一個位置的一個文件中。通過這樣做,我確保頭部可以自行編譯。

要convence鏈接器不會發出警告,人們可以使用一個外部變量,一個非常大的變化:

int variable_with_a_name_that_includes_the_file_name_somehow = 42; 
+0

是的,這是有道理的,但如果您稍後在別處使用了標頭,您是否會刪除該文件? – 2012-07-18 16:12:25

+0

@Joe不,當它被包含在其他地方時,很難確定,未來會這樣做,並且沒有人會在包含之前加入包含。 – 2012-07-18 16:13:34

+0

好的,所以在這種情況下,它只是作爲安全防範誤用在路上。謝謝! – 2012-07-18 16:14:57

2

當時單#include d stdafx.h文件? I.這種情況下,你正在處理precompiled headers。正常的設置是爲一個.cpp文件提供「生成預編譯頭文件」的編譯選項,而項目中其餘的.cpp文件具有「使用pch」。

+0

不,它實際上並不是stdafx.h,但我在前期查找答案時確實找到了它的參考。但是,這仍然是有用的信息,所以謝謝! – 2012-07-18 23:49:35

相關問題