通过条件语句预处理器
我从来没有使用#if , #ifdef , #ifndef , #else , #elif和#endif 。
当我通过一些源代码时,我发现了这些指令的广泛使用。 对条件预处理器进行了一些阅读,但没有发现像他们与常规条件语句不同的线索。 所以我想知道下面的代码有什么优势:
#include<iostream>
int main()
{
int i = 0;
#if i == 0
std::cout<<"This";
#else
std::cout<<"That";
#endif
return 0;
}
在此:
#include<iostream>
int main()
{
int i = 0;
if (i == 0)
std::cout<<"This";
else
std::cout<<"That";
return 0;
}
此外,何时使用 /不使用条件预处理器?
有条件的预处理器在第一个例子中不起作用。
它使用常量,你看到了吗? 在编译时,它会查看各种条件并根据它放入/省略源代码。
例如:
#define HAS_COMPARISON
int main() {
#ifdef HAS_COMPARISON
int i = 0;
if(i == 0) std::cout << "This";
else
#else
std::cout << "That";
#endif
}
通过define
集,它将设置变量i
并执行比较...总之,它将输出This
。 如果您对该定义发表评论,则整个模块将不在您的程序中,这意味着它将始终输出That
,而无需设置变量或进行比较。
这是预处理器定义最常用的用法。 您也可以定义值并将它们与具有相同定义的变量行为进行比较,但这是另一个问题。
再一次:条件预处理器在编译时被评估,变量条件在运行时被评估。
由于缺乏其他信息,您展示的示例似乎并不有用。 但是这里有一个例子, #if
是有用的。
#if OS == LINUX
//do something
#elif OS == SOLARIS
//do something else
#else
//
#endif
关键是#if
在编译时被评估,但是if
在程序运行时被评估。
#if BYTE_ORDER == LITTLE_ENDIAN
//do something
#else
//do something else
#endif
在这种情况下使用预处理器指令并不完全有用。 但是,在许多其他情况下,使用这些预处理器指令是有用的。
这些预处理器指令可用于条件编译。 例如,如果某些程序必须针对多个平台开发,那么可以为平台特定的常量赋予值。 可以完成特定于平台的这些值编译,而整个代码可以作为一个大实体来维护。
这些在调试时也很有用。 测试单元可以编译到代码中,并在调试时使用这些条件编译来运行,并且可以停止使用这些编译进行编译。
链接地址: http://www.djcxy.com/p/29425.html上一篇: preprocessor over conditional statements
下一篇: Why not use margin positioning instead of using position:relative top 5px?