if else和#if #else #endif之间的区别

时间:2015-03-11 15:31:24

标签: c++ c macrodef

我对if / else#if / #else / #endif结构感到困惑。

  1. 他们之间有什么区别?
  2. 我应该在哪些具体情况下使用它们?

3 个答案:

答案 0 :(得分:10)

if(...)else(...)条件在运行时进行评估。 #if#else在编译时由预处理器进行评估。

答案 1 :(得分:6)

  

我对if / else和#if /#else /#endif感到困惑。看起来   它们具有相同的逻辑功能。

     

我可以问一下它们之间有什么区别吗?

#if#else#endif属于预处理。它们未执行,但是是文本替换的说明。您可以将它们视为一种通常在文本编辑器中找到的自动“搜索和替换”功能。

ifelse是运行时构造。您可以将它们视为在程序运行时执行。

假设你有这个程序:

#include <iostream>

#define VALUE 1

int main()
{
#if VALUE == 1
    std::cout << "one\n";
#else
    std::cout << "not one\n";
#endif
}

当您告诉编译器编译此程序时,预处理器将在实际编译“真正的”C ++代码之前进行文本替换。这就好像程序是:

#include <iostream>

int main()
{
    std::cout << "one\n";
}

现在,从技术上讲,你可以在这里使用if

#include <iostream>

#define VALUE 1

int main()
{
    if (VALUE == 1)
    {
        std::cout << "one\n";
    }
    else
    {
        std::cout << "not one\n";
    }
}

但是在C ++中,不会将#define用于常量。你会有类似的东西:

#include <iostream>

int const value = 1;

int main()
{
    if (value == 1)
    {
        std::cout << "one\n";
    }
    else
    {
        std::cout << "not one\n";
    }
}

也许该值仅在程序执行时才知道,例如通过用户输入。那么你显然不能使用#if,它只能在程序运行之前运行。您必须使用if

#include <iostream>

int main()
{
    int value;
    std::cin >> value; // gross simplification here

    if (value == 1)
    {
        std::cout << "one\n";
    }
    else
    {
        std::cout << "not one\n";
    }
}

What kind of specific situations for me to choose each of them?

初学者的一个好指南是:仅include guards使用#if(或实际:#ifndef)。当遇到只能由预处理器解决的问题时,请考虑进一步使用#if

答案 2 :(得分:4)

  

我可以问一下它们之间的区别吗?

#if #else#endif是编译器的指令,只编译它们之间的代码,如果编译级别条件(如定义的宏或具有某个值)很满意。

ifelse是已编译算法的一部分。

  

我选择哪一种具体情况?

预编译条件用于禁用部分代码,在它们没有意义的情况下(比如在Linux下编译时调用特定于Windows的API)。它们是开发跨平台代码的关键(例如)。