2009-06-15 55 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

我会建议不要做你所问的。隐藏您的代码是多平台的事实很容易导致您或其他人未意识到他们正在触摸的代码需要针对每个平台进行修改。

举例来说,如果你加什么线做一个行之后吧?你如何判断它是否在区块内部或外部?您添加的新行可能还需要在其他部分中的适当的备用行。或者,如果它不在区域内,则可能不知道它会打破另一个版本。

这似乎很不方便,但这就是语言的方式。最好的方式是按照设计的方式习惯语言的显示方式,并采用与其他人使用相同的方式,而不是试图根据自己的喜好来解决问题。

相关问题