条件预处理器相对于条件语句的优势

Advantages of conditional-preprocessor over conditional statements

本文关键字:条件 相对于 预处理 处理器 语句      更新时间:2023-10-16

我从未与 #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

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

这些预处理器指令可用于条件编译。 例如,如果必须为多个平台开发某个程序,则可以给出特定于平台的常量值。可以更改特定于平台的这些值编译,同时可以将整个代码维护为一个大实体。

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

条件编译意味着 ifdef-ed out 代码实际上永远不会出现在最终的链接应用程序中。仅使用语言条件意味着两个分支都在最终代码中,使其更大并且可能更难测试等。

当您在编译时知道需要什么时,请使用 #ifdef 等。当您在运行时之前不知道需要什么时,将使用语言条件。

预处理器的好处是代码被抛弃了。 它不会被编译(这需要时间(,也不会生成将被加载到 ram 中的机器代码。 如果决策多次处于非常紧密的循环运行中,则速度可能会提高。 不过,不要认为这很重要,除非你真的计时了。

预处理器的缺点是,您显然必须在编译时知道答案。 源代码现在包含许多可能永远不会执行的代码。 对于人类来说,跟踪变得更加困难,因为通常很难确定这些编译时值是什么。