在跨平台项目中工作时,很可能在代码中会遇到很多#ifdef块。这实际上非常烦人,并且很难阅读代码。
我想知道是否有办法隐藏那些不相关的ifdef块?我正在使用Visual Studio 2005。
例如,如果您有此代码:
#ifdef _PC_
do a
#else
do b
#endif
如果定义了_PC_
,工具/插件应该只显示:
do A
答案 0 :(得分:3)
虽然我的答案并不完全符合您的要求,但这是我所知道的最佳答案。
在Visual Studio 2005中,可以使用大纲工具折叠#ifdef块的未使用部分。
想到的另一个想法是将特定于操作系统的代码分解到自己的文件中,并使用包含#ifdef块的主文件和不跨平台更改的代码的重要部分(即完整声明)。
我想到的另一件事是简单地将条件块的代码分组。在许多情况下,代码顺序可能无关紧要,您可以将这些代码组合在一起。
如果您只想将该文件用作参考材料,那么可以执行的另一件事是通过预处理器运行该文件,该预处理器仅处理条件块并忽略处理条件块所不需要的任何内容。
答案 1 :(得分: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
}
}
答案 2 :(得分:1)
我建议不要做你所问的事情。隐藏您的代码是多平台的事实很容易导致您或其他人没有意识到他们正在触摸的代码需要针对每个平台进行修改。
例如,如果您在执行A行之后添加一行,该怎么办?你怎么知道它是在里面还是在街区之外?您添加的新行也可能需要在另一部分中使用适当的备用行。或者,如果它超出了块,你可以在不知道它的情况下打破其他版本。
这可能看起来很不方便,但这就是语言的方式。最好习惯语言的显示方式与其他人使用它的方式相同,而不是试图根据自己的喜好来解决问题。
答案 3 :(得分:0)
只需使用以下预处理程序指令:
#region IfDef
#ifdef PC
doSomethingCalledA();
#else
doSomethingCalledB();
#endif
#endregion
答案 4 :(得分:0)
为您正在处理的每个平台设置解决方案,并在每个平台中定义相应的宏。在所有解决方案中包含源文件。然后浏览并折叠与当前解决方案的平台不匹配的代码部分。
Visual Studio将保存每个解决方案的折叠部分设置,因此您将根据打开的项目看到不同的扩展代码。我认为这存储在* .suo文件中。