预处理器的缺陷-learning ros for robotics programming - second edition
8.1预处理器的缺陷
预处理器宏存在的关键问题是我们可能认为预处理器的行为和编译器的行为一样。当然,有意使宏在外观上和行为上与函数调用一样,因此容易被混淆。当微妙的差异出现时,问题就出现了。考虑下面这个简单例子:
#define f (x) (x+1)
现在假如有一个像下面的f的调用:
f (1)
预处理器展开它,出现下面不希望的情况:
(x) (x+1) (1)
出现这个问题是因为在宏定义中f和括号之间存在空格缝隙。当定义中的这个空格取消后,实际上调用宏时可以有空格空隙。像下面的调用:
f ( 1 )
依然可以正确地展开为:
(1 + 1)
上面的例子虽然微不足道但问题非常明显。在宏调用中使用表达式作为参数时,问题就出现了。存在两个问题。第一个问题是表达式在宏内展开,所以它们的优先级不同于我们所期望的优先级。例如:
#define floor(x,b) x>=b?0:1
现在假如对参数使用表达式:
要深入了解宏定义和函数调用的区别,可以参考这篇详细解释。宏定义在C语言中有很多妙用,想知道更多可以看这篇文章。
对于GCC编译器的内建宏定义,这篇资料将提供详细的解释。如果你对如何规范地编写宏定义感兴趣,看看这篇规范的宏定义格式以及宏定义编程技巧,一定会有所收获。
不同宏定义在实际编程中的应用,可以参考这篇函数模板与宏定义,以及如何在Python中定义和调用函数的方式,可以参考这篇文章。这些资源不仅能帮助你更好地理解宏定义,还能在实际编程中为你提供有用的技巧和方法。
如何,以上内容是否解答了你对预处理器宏的疑惑?请随时提出更多问题或查看提供的链接来深入学习!
下载地址
用户评论