2009-06-15 58 views
2

在跨平臺項目中工作時,很可能您會在代碼中遇到很多#ifdef塊。這實際上很煩人,並且很難閱讀代碼。Visual Studio:隱藏ifdef塊

我不知道是否有隱藏那些不相關的ifdef塊的方法嗎?我使用Visual Studio 2005

例如,如果你有這樣的代碼:

#ifdef _PC_ 
do a 
#else 
do b 
#endif 

如果_PC_定義,工具/插件應僅顯示這樣的:

do A 

回答

3

雖然我的回答不完全是你要找的,但這是我所知道的最好的。

在Visual Studio 2005中有可能使用概述工具崩潰#ifdef來塊的未使用部分。

想到的另一個想法是將操作系統特定的代碼分離到它們自己的文件中,並使用包含#ifdef塊和主要部分(即完整聲明)的主文件,這些代碼不跨平臺更改。

還有一個想到的事情是簡單地爲分組條件塊在以往任何時候可能的代碼。在許多情況下,代碼順序可能並不重要,您可以將代碼組合在一起。

,如果你只是想使用該文件作爲參考材料是通過預處理程序,只處理條件塊,而忽略不需要處理的條件塊任何運行該文件可以做其他的事情。

0

只需使用以下預處理指令:

#region IfDef 
    #ifdef PC 
     doSomethingCalledA(); 
    #else 
     doSomethingCalledB(); 
    #endif 
#endregion 
+0

問題是我必須爲每個文件做這件事.. – tep 2009-06-15 23:23:22

1

最乾淨的方法,我已經看到(和使用)是使用Strategy Pattern,從而可以將特定於平臺的代碼抽象爲單獨的戰略類。

例如。

class MyAbstractClass 
{ 
    static MyAbstractClass Create() 
    { 
     #ifdef win32 
     return new WindowsClass(); // this could be a shared_ptr 
     #else 
     return new PosixClass(); 
     #endif 
    } 
    virtual method MyMethod() = 0; 
} 

// windows_class.cpp 
class WindowsClass : public MyAbstractClass 
{ 
    virtual method MyMethod() 
    { 
     // platform specific code here 
    } 
} 

// posix_class.cpp 
class PosixClass : public MyAbstractClass 
{ 
    virtual method MyMethod() 
    { 
     // platform specific code here 
    } 
} 
0

爲您正在使用的每個平臺設置解決方案,並在每個平臺中定義相應的宏。在所有解決方案中包含源文件。然後通過並摺疊與當前解決方案的平臺不匹配的代碼段。

Visual Studio將保存您的坍塌部分設置每個解決方案,所以你會看到不同的展開碼取決於哪個項目你打開。我認爲這存儲在* .suo文件中。

1

我會建議不要做你所問的。隱藏您的代碼是多平臺的事實很容易導致您或其他人未意識到他們正在觸摸的代碼需要針對每個平臺進行修改。

舉例來說,如果你加什麼線做一個行之後吧?你如何判斷它是否在區塊內部或外部?您添加的新行可能還需要在其他部分中的適當的備用行。或者,如果它不在區域內,則可能不知道它會打破另一個版本。

這似乎很不方便,但這就是語言的方式。最好的方式是按照設計的方式習慣語言的顯示方式,並採用與其他人使用相同的方式,而不是試圖根據自己的喜好來解決問題。

相關問題