条件预处理器相对于条件语句的优势
Advantages of conditional-preprocessor over conditional statements
我从未与 #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
在这种情况下使用预处理器指令并不完全有用。但是,这些预处理器指令的使用在许多其他情况下很有用。
这些预处理器指令可用于条件编译。 例如,如果必须为多个平台开发某个程序,则可以给出特定于平台的常量值。可以更改特定于平台的这些值编译,同时可以将整个代码维护为一个大实体。
这些在调试时也很有用。测试单元可以编译到代码中,并在调试时使用这些条件编译运行,并且可以停止使用这些条件编译来编译它们。
条件编译意味着 ifdef-ed out 代码实际上永远不会出现在最终的链接应用程序中。仅使用语言条件意味着两个分支都在最终代码中,使其更大并且可能更难测试等。
当您在编译时知道需要什么时,请使用 #ifdef
等。当您在运行时之前不知道需要什么时,将使用语言条件。
预处理器的好处是代码被抛弃了。 它不会被编译(这需要时间(,也不会生成将被加载到 ram 中的机器代码。 如果决策多次处于非常紧密的循环运行中,则速度可能会提高。 不过,不要认为这很重要,除非你真的计时了。
预处理器的缺点是,您显然必须在编译时知道答案。 源代码现在包含许多可能永远不会执行的代码。 对于人类来说,跟踪变得更加困难,因为通常很难确定这些编译时值是什么。
- 对于检查 >=0 终止条件时的循环索引类型
- unique_ptr相对于shared_ptr的优势是什么
- int 相对于C++中主代码的目的
- SourceAddress 是否相对于 MmCopyVirtualMemory 中的 SourceProcess?
- 对于仅带条件的循环
- C ,循环,有2个条件,V.对于具有2个条件的循环
- 相对于类statics的基元全局的生存期
- 实现现有的网络接口,以相对于C 11中的Endianess定义位字段
- 如何添加相对于QTABBAR中标签的位置的小部件
- 相对于 3D 应用程序中的 Windows 消息循环的计时错误
- §12.3.2 [class.conv.fct]/1 in C++1z 相对于 C++14 发生了重大变化。有意义吗?
- 相对于 cpp 不工作目录的路径
- 使用原生C++Qt相对于PyQt有什么优势?
- 打开相对于chromium.exe的文件
- msvcr100相对于msvcrt的优势
- at()函数相对于get(ch)的必要性
- unique_ptr相对于auto_ptr的优点
- c++中std::thread相对于pthread的优势
- 为什么检查分配操作的结果有效,但不能与其他条件相结合
- 哈希,相对于x,y位置的多边形