2013-01-08 98 views
1

我想在Windoes和Linux上編譯並運行C++代碼的一個副本。所以我需要使用條件編譯(CC)。然而,它遇到了這個問題,如何使用CC在大量的代碼文件有大量代碼文件的C++條件編譯

比如,我有:

//A.cpp 
#define _WINDOWS_ 
#ifdef _WINDOWS_ 
#include <windows.h> 
//some code for windows 
#else 
#include <pthread.h> 
//some code for linux 
#endif 

,我也有B.cpp,C.cpp ...

我應該寫 「的#define _WINDOWS_」 在每一個文件,或它有更好的方法嗎?

,我已經嘗試這樣做: 1.創建一個頭文件Platform.h

#ifndef _PLAT_ 
#define _PLAT_ 
#define _WINDOWS_ 
#endif 

2.包括文件Platform.h,如:

//A.cpp 
#include "Platform.h" 
#ifdef _WINDOWS_ 
#include <windows.h> 
//some code for windows 
#else 
#include <pthread.h> 
//some code for linux 
#endif 

3它編譯錯誤!在包含導致錯誤之前可能包括「Platform.h」。

謝謝。

+3

你最好使用'_WIN32'而不是滾動你自己的。 – chris

+0

我覺得你需要抽象工廠把你的代碼分離到不同的平臺上嗎? http://en.wikipedia.org/wiki/Abstract_factory_pattern – billz

+0

什麼是編譯錯誤?看起來像它應該至少工作 –

回答

2

使用編譯器中的一些預定義的宏。

http://sourceforge.net/p/predef/wiki/OperatingSystems/

#ifdef _WIN32 
// Code specific to Windows. 
#elif defined __linux__ // Many variants; check the link above. 
// Code specific to Linux. 
#else 
// Portable code. 
#endif 

這將在大多數的情況下工作。

注意,大多數宏被用來檢測主機操作系統(也就是,在你正在構建的程序的系統),而不是目標操作系統(該系統中所產生的程序打算運行)。但是,兩個系統通常是一致的。還要注意,這些宏是否實際上是預定義的,顯然取決於你的特定編譯器。如果一切都失敗(例如,目標系統與主機不同,或者你的編譯器足夠奇怪以至於不能預定義任何系統檢測宏),只需在編譯器的命令行中定義它們中的任何一個(例如,在POSIX兼容的C編譯器中使用-D),方法是將其放入構建腳本或生成文件中。不要在頭部自己寫這樣的#define

+0

+1,但通常針對不同的平臺進行編譯需要交叉編譯器來定義適當的平臺標誌。試圖通過手動調整來獲得另一個平臺的代碼可能是一場不可能的戰鬥。 – Potatoswatter

0

在編譯期間可以使用-D_WINDOWS_。對於(3)請注意,標題對排序很敏感。

+0

-1,這是將用戶與糾結構建系統混淆的絕對方式。 – Potatoswatter

+0

是的,它通常取決於很多因素。我在一家擁有非常龐大代碼基礎的公司工作,這已經流行了十年。這又是一個工程問題,當這種方法很好時,會有多種情況。在整個用例清除之前,我不會爲這種方法發佈一個「否」。 – user1952500