2014-09-11 83 views
1

目前在我的應用我只是有一個單一的源代碼樹C++單獨的Include和源目錄和#INCLUDE

MyApp/Source 
|-Precompiled.hpp 
|-Precompiled.cpp 
|-Thing.hpp 
|-Thing.cpp 
|-Main.cpp 
|-Component 
| |-ComponentThing.hpp 
| |-ComponentThing.cpp 
| |-... 
|-ComponentB 
| |-ComponentBThing.hpp 
| |-... 
|-PluginCandiate 
| |-PluginThing.hpp 
| |-PluginThing.cpp 
| |-... 
... 

但是我希望做一個插件系統(這樣少的東西是與核心應用程序的一部分清晰的邊界),我想移動到單獨的Include \ MyApp樹中的那麼多.hpp文件。所以新的樹可能看起來像:

MyApp/Include/MyApp 
|-Thing.hpp 
|-Component 
| |-ComponentThing.hpp 
| ... 
|-ComponentB 
| |-ComponentBThing.hpp 

MyApp/Source 
|-Precompiled.hpp 
|-Precompiled.cpp 
|-PrivateThing.hpp 
|-PrivateThing.cpp 
|-Component 
| |-ComponentThing.cpp 
| |-... 
|-ComponentB 
| |-... 
... 

Plugins/PluginCandiate/Source 
|-PluginThing.hpp 
|-PluginThing.cpp 
... 

現在用目前的方式,我只包含我的包含路徑上的「源」。這意味着,例如在ComponentThing.cpp我可以做說:

#include "Precompiled.hpp" 
#include "ComponentThing.hpp" 
#include "ComponentOtherThing.hpp" 
#include "ComponentB/ComponentBThing.hpp" 

由於當前目錄永遠是第一位的包括路徑上。但是,如果我拆分我的公共包含目錄和源目錄,情況就不再這樣了。我可以將Include/Myapp /放在包含路徑中,但是Id仍然需要全部組件路徑。

是否有一種簡單的方法可以避免這種情況(使用MSVC MSBuild和Linux make文件),還是隻有完整的#includes纔是標準做法?或者有其他人通常會做的事情(例如,我考慮了構建後步驟來「導出」主源樹中列出的公共標題集)?

+0

您能否詳細說明您的意思:「我可以將Include/Myapp /放在包含路徑中,但是Id仍然需要全部組件路徑」? – downhillFromHere 2014-09-11 07:54:51

+0

因此,對於說ComponentThing.cpp我不需要一些包括像「../../Include/MyApp/Component/ComponentThing.hpp」的垃圾,但我仍然需要「組件/ ComponentThing.hpp」,而不是隻是「 ComponentThing.hpp「 – 2014-09-11 09:29:22

回答

2

是的。您可以將路徑添加到新的包含文件夾,只需要將路徑中的相對路徑包含在包含路徑中即可。#include "filename.h"

例如如果你有以下目錄樹:

+ MyApp 
    - file.c 
    - file.h 
    + Plugins 
    + Include 
    - pluginheader.h 

在file.c任何#include可能是相對的:

#include "Plugins/Include/pluginheader.h" 

,或者你可以添加./Plugins/Include到include路徑,只需使用

#include "pluginheader.h" 

(您不必指定完整路徑,只是工作目錄的相對路徑)

編輯: 這是那些東西,你可以easilly嘗試自己一個,我覺得這是一個基於您的評論你問的是什麼:

./file.c

#include <stdio.h> 
#include "module/function.h" 
int main() 
{ 
    int sum; 
    myStruct orange; 
    myStruct_insert(&orange, 5, 6); 
    sum = myStruct_sum(&orange); 
    printf("%d",sum); 
    return 0; 
} 

./module/function.h

typedef struct{ 
    int one; 
    int two; 
}myStruct; 

void myStruct_insert(myStruct *apple, int one, int two); 

int myStruct_sum(myStruct *apple); 

./module/function.c

#include "function.h" 
void myStruct_insert(myStruct *apple, int one, int two) 
{ 
    (*apple).one = one; 
    (*apple).two = two; 
} 

int myStruct_sum(myStruct *apple) 
{ 
    return (*apple).one+(*apple).two; 
} 

我編譯了這個gcc file.c ./module/function.c(不包括路徑添加)。它編譯沒有錯誤和正確執行:

$ gcc file1.c module/function.c 
$ ./a 
11 
$ 

所以回答你的問題是肯定的,它將包括在同一文件夾標頭,你的代碼編譯器目前正在對。或者至少對於GCC來說。 MSVC等可能有不同的行爲。

但是最好指定明確性。它比較冗長,但不太容易與名稱類似的頭文件混淆。

+0

當然,但假設每個模塊只有一個平面目錄,這不是我所說的,我也在討論包括東西在內的東西,而不是跨組件/模塊包含哪裏ModuleX/ComponentX/ThingX.hpp是有道理的,雖然沒有那麼討厭/包括/) – 2014-09-11 09:37:02

+0

@FireLancer增加了一個工作的例子,我認爲更好地捕捉你的問題。 – Baldrickk 2014-09-11 10:12:25