2013-08-12 66 views
2

在我的文件夾我有一個小version.cpp文件結構如下:包括如何在C++中工作?

#include "thelibr/version.h" 

const int major = MAJOR; 
const int minor = MINOR; 

我無法理解這樣的代碼做什麼以及如何使用它的代碼的剩餘部分(存儲在相同的其他文件目錄)。

首先,據我所知,代碼將兩個變量(majorminor),但什麼是我不明白是哪裏的MAJORMINOR值被設置的值。它們是否設置爲thelibr/version.h

其次,當執行上面給出的代碼行時,我也不清楚。它們沒有放入任何可能從其他文件中編碼的其他方法調用的方法。那麼,如何調用這些行呢?

第三,我看到字符串version不存在於同一目錄中的任何其他文件中。這是否意味着這些文件都不使用存儲在version.cpp中的代碼。我們不應該在其他文件中包含version.h文件,以便能夠使用version.cpp中的代碼嗎?第四,如果我們在version.cpp中設置了majorminor變量的值,那麼這些變量是否會在其他地方可見?它令我想起我,因爲我們不使用任何字樣,如globalexternal

回答

1

C++沒有像Python這樣的模塊系統,其中可以導出純符號並將其值用在另一個源文件中。相反,它有頭文件:thelibr/version.h的內容基本上是複製粘貼而不是#include行。該文件內的任何內容都將被處理,如同在version.cpp文件中寫出的一樣。

要從一個文件導出到另一個文件(或者創建鏈接器或動態加載器可以解釋的庫),請使用extern存儲器,這是很多事情的默認設置。

決定從一個.cpp文件到下一個文件可見的內容相當複雜,但通常不能共享編譯時間值,例如版本號;您只能共享對存儲版本號的運行時對象(如int)的訪問權限。

要使用majorminor從另一個.cpp文件,你可以聲明在version.h

extern const int major; 
extern const int minor; 

再從其他文件#include "thelibr/version.h"

+1

恕我直言,如果你提供了一個例子,你可能會一路走來並顯示一個樣本version.h,version.cpp。否則,我擔心你的回答可能會導致OP的混亂。 – idoby

+0

@busy_wait我還應該添加什麼?除了我認爲他已經擁有的頭衛兵之外,這個特殊的例子似乎已經被覆蓋了。問題是許多其他類型的情況,例如'inline'函數,'static'對象和'static'成員。說實話,聽起來OP似乎並沒有準備好深入C++。 – Potatoswatter

+0

我認爲關於#includes的問題同樣適用於C++的子集,看起來就像C. IMO最重要的一點應該是說明通過頭文件共享#define與共享一個在其中一個實現文件中實際定義的變量的聲明。只是我的兩分錢。我不想通過寫我自己的方式來削弱你的好回答。 – idoby