我的问题首先是理解#ifndef
和#ifdef
。我也想明白之间的差别#if
,#ifndef
和#ifdef
。我了解这#if
基本上是一个if语句。例如:
#include<iostream>
#define LINUX_GRAPHICS 011x101
int main(){
long Compare = LINUX_GRAPHICS;
#if Compare == LINUX_GRAPHICS
std::cout << "True" << std::endl;
#endif
}
但是其他人,尽管我阅读了有关它们的文章,但我还是无法理解。它们看起来也很相似,但是我怀疑它们的工作方式是否相似。帮助将不胜感激。
预处理器对宏进行扩展,该预处理器在运行时对变量的值一无所知。它仅涉及文本替换(或比较预处理器已知的符号)。你的线
#if Compare == LINUX_GRAPHICS
将扩展到
#if Compare == 011x101
并且由于“比较”与“ 011x101”不同,因此评估为false。实际上,我什至不能100%地确定这一点,但重点是:您正在将预处理器指令与在运行时求值的变量混合在一起。那是胡说八道。没有预处理器指令可以代替C ++语句。
对于大多数传统的宏用例来说,如今有更好的方法。如果您确实不需要使用宏,则最好不要使用它们。这使得阅读代码非常困难(例如,我不明白您代码中的宏是如何工作的,除非我真的很诚实,否则我不想知道:P),并且宏还有其他问题,可能会导致非常困难在您的程序中查找错误。在使用宏之前,我建议您首先考虑是否存在更自然的C ++实现方法。
PS:
#ifdef SYMBOL
ifdef = "if defined"
this part of the code is excluded before the compiler even sees it
if SYMBOL is not defined (via #define)
#endif
#ifndef SYMBOL
ifndef = "if not defined"
this part of the code is excluded before the compiler even sees it
if SYMBOL is defined (via #define)
#endif
我之所以写“排除在外”是为了强调它对代码可读性的不利影响。如果您过度使用#ifdef
或#ifndef
在常规代码块内,将很难阅读。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句