通过条件语句预处理器

我从来没有使用#if#ifdef#ifndef#else#elif#endif

当我通过一些源代码时,我发现了这些指令的广泛使用。 对条件预处理器进行了一些阅读,但没有发现像他们与常规条件语句不同的线索。 所以我想知道下面的代码有什么优势:

#include<iostream>
int main()
{
    int i = 0;

    #if i == 0
         std::cout<<"This";
    #else
         std::cout<<"That";
    #endif
    return 0;
}

在此:

#include<iostream>
int main()
{
    int i = 0;

    if (i == 0)
         std::cout<<"This";
    else
         std::cout<<"That";
    return 0;
}

此外,何时使用 /不使用条件预处理器?


有条件的预处理器在第一个例子中不起作用。

它使用常量,你看到了吗? 在编译时,它会查看各种条件并根据它放入/省略源代码。

例如:

#define HAS_COMPARISON

int main() {
    #ifdef HAS_COMPARISON
        int i = 0;
        if(i == 0) std::cout << "This";
        else
    #else
        std::cout << "That";
    #endif
}

通过define集,它将设置变量i并执行比较...总之,它将输出This 。 如果您对该定义发表评论,则整个模块将不在您的程序中,这意味着它将始终输出That ,而无需设置变量或进行比较。

这是预处理器定义最常用的用法。 您也可以定义值并将它们与具有相同定义的变量行为进行比较,但这是另一个问题。

再一次:条件预处理器在编译时被评估,变量条件在运行时被评估。


由于缺乏其他信息,您展示的示例似乎并不有用。 但是这里有一个例子, #if是有用的。

#if OS == LINUX
//do something
#elif OS == SOLARIS
//do something else
#else
//
#endif

关键是#if在编译时被评估,但是if在程序运行时被评估。

#if BYTE_ORDER == LITTLE_ENDIAN
//do something
#else
//do something else
#endif

在这种情况下使用预处理器指令并不完全有用。 但是,在许多其他情况下,使用这些预处理器指令是有用的。

这些预处理器指令可用于条件编译。 例如,如果某些程序必须针对多个平台开发,那么可以为平台特定的常量赋予值。 可以完成特定于平台的这些值编译,而整个代码可以作为一个大实体来维护。

这些在调试时也很有用。 测试单元可以编译到代码中,并在调试时使用这些条件编译来运行,并且可以停止使用这些编译进行编译。

链接地址: http://www.djcxy.com/p/29425.html

上一篇: preprocessor over conditional statements

下一篇: Why not use margin positioning instead of using position:relative top 5px?