为什么在预处理器中使用if语句定义?

时间:2014-06-12 14:00:39

标签: if-statement c-preprocessor preprocessor-directive

在探索源包时,我发现一些if语句是由预处理器指令定义的,然后在代码中使用,如下例所示:

#ifdef _WIN32
    #define OSisWindows() true
    #define OSisLinux() false
#elif defined(__linux__)
    #define OSisLinux() true
    #define OSisWindows() false
#endif

if ( OSisWindows() )
{
// do something
}

if ( OSisLinux() )
{
// do something else
}

使用此功能与简单定义(如_WIN32__linux__之间有区别吗?

4 个答案:

答案 0 :(得分:3)

嗯,您无法在代码中直接使用宏,如:

if ( _WIN32 ) {
    ...
}
例如,在Linux上

因为它没有被定义所以它们只是将宏映射到布尔表达式。

最后,它确实是一种风格决定......他们当然可以做到:

#ifdef _WIN32
    ...
#endif

答案 1 :(得分:3)

假设定义了宏,使用if..else语句优于#if .. #else指令的优点是所有代码路径都是在第一种情况下编译的,所以如果有编译编译器能够在所有代码路径中看到它们的错误。当然,这并不总是可行的,因为一些代码路径可能是依赖于平台的代码。

答案 2 :(得分:1)

除了已经编写的内容之外,它还是另一层抽象。例如,如果_WIN32的语法发生更改,或者您希望在不依赖于标志的情况下显式编译Windows,则必须更改完整代码,以防直接使用_WIN32。在这种情况下,您只需更改预处理程序指令。

答案 3 :(得分:0)

  

使用此和简单定义(如_WIN32或 linux )之间是否存在差异?

不,这是一个简单的宏滥用。