我对if
/else
和#if
/ #else
/#endif
结构感到困惑。
- 它们之间有什么区别?
- 我应该在哪些特定情况下使用它们?
if(...)
和else(...)
条件在运行时评估。#if
,#else
在编译时间之前由预处理器进行评估。
我对 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
for 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
我能问一下它们之间有什么区别吗?
#if
#else
并且#endif
是对编译器的指令,仅在满足编译级别条件(如定义的宏或具有特定值)时编译它们之间的代码。
if
并且else
是编译算法的一部分。
我分别选择什么样的具体情况?
预编译条件用于禁用部分代码,在它们没有意义的情况下(如在 Linux 下编译时调用特定于 Windows 的 API)。它们是开发跨平台代码的关键(例如)。