核心区别
条件编译发生在预处理期,由预处理器根据条件关掉代码片段,即不让这些代码到达编译期。
if constexpr:发生在编译期,由编译器在编译期确定要执行的分支。
其他所有的区别都是此核心区别的衍生。
用法的区别
能放的位置
条件编译几乎在哪都行。
if constexpr 只能在函数体内(当然,含类的成员函数),因为它是个语句。
对语法的要求
条件编译中,被切掉的分支可以不符合语法。因为预处理在编译之前,编译器看不到被切掉的部分。
if constexpr 中,未选中的分支会不产生机器码,但必须符合语法。因为这是由编译器来干的。
容易看出,这些区别都是核心区别的直接推论。
使用场景
由上述区别,可以容易得出:
如果需要在编译前介入,比如条件编译。例如,编写多平台程序。
#ifdef FOO_WINDOWS
#include <windows.h>
#endif
#ifdef FOO_LINUX
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#endif#ifdef FOO_WINDOWS
int openFile(const std::string& path)
{// ...CreateFile(...);// ...
}
#endif#ifdef FOO_LINUX
int openFile(const std::string& path)
{// ...open(...);// ...
}
#endif
本例中,给 Windows 和 Linux 分别实现打开文件的程序,用条件编译让这段代码可以在两个平台上编译。在其中一个平台上,针对另一个平台的代码是无法编译的。