-3

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

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

3 回答 3

11

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

于 2015-03-11T15:33:34.147 回答
9

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

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

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

if并且else是运行时构造。您可以将它们视为在程序运行时执行。

假设你有这个程序:

#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++ 中,您不使用#definefor constants。你会得到类似的东西:

#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?

对于初学者来说,一个好的指导方针是:仅使用#if(或实际上:)包含警卫。当您遇到只能由预处理器解决的问题时,请考虑进一步使用。#ifndef#if

于 2015-03-11T16:18:42.580 回答
5

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

#if #else并且#endif是对编译器的指令,仅在满足编译级别条件(如定义的宏或具有特定值)时编译它们之间的代码。

if并且else是编译算法的一部分。

我分别选择什么样的具体情况?

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

于 2015-03-11T15:37:05.393 回答