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

za1*_*a17 -6 c c++ macrodef

我在if/ else#if/ #else/ #endif构造之间感到困惑.

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

wol*_*k88 10

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

  • 甚至在编译之前;) (2认同)

Chr*_*ckl 7

我对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
}
Run Code Online (Sandbox Code Playgroud)

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

#include <iostream>

int main()
{
    std::cout << "one\n";
}
Run Code Online (Sandbox Code Playgroud)

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

#include <iostream>

#define VALUE 1

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

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

#include <iostream>

int const value = 1;

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

也许该值仅在程序执行时已知,例如通过用户输入.然后你显然不能使用#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?
Run Code Online (Sandbox Code Playgroud)

初学者的一个很好的指导原则是:使用#if(或实际:) #ifndef仅用于包括警卫.#if当您遇到只能由预处理器解决的问题时,请考虑进一步使用.


utn*_*tim 6

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

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

ifelse是编译算法的一部分。

什么样的具体情况适合我选择?

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