我对if
/ else
和#if
/ #else
/ #endif
结构感到困惑。
答案 0 :(得分:10)
if(...)
和else(...)
条件在运行时进行评估。 #if
,#else
在编译时由预处理器进行评估。
答案 1 :(得分:6)
我对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 ++中,不会将#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
是编译器的指令,只编译它们之间的代码,如果编译级别条件(如定义的宏或具有某个值)很满意。
if
和else
是已编译算法的一部分。
我选择哪一种具体情况?
预编译条件用于禁用部分代码,在它们没有意义的情况下(比如在Linux下编译时调用特定于Windows的API)。它们是开发跨平台代码的关键(例如)。