C++预处理器不理解任何关于C++的内容,包括模板

2020-05-09 15:04:52

C和C++预处理器类似于Windows命令提示符批处理语言:它们实现了一种非常简单的语言,人们出于某种原因仍在使用该语言,通常是通过将其推到超出其原始设计边界的方式。

预处理器并不真正理解C或C++语言。幸运的是,它使用的算术运算符与C和C++语言使用的算术运算符相同,但它对它们的理解仅限于整数。

预处理程序参数中逗号的处理非常简单:用逗号分隔宏参数。保护逗号的唯一方法是将其括在匹配的括号中。

请注意,小于号和大于号不保护逗号。如果要将模板实例化作为宏参数传递,这可能会造成混淆。

预处理器不够聪明,无法意识到您传递的是模板实例化。毕竟,也许你想要这个:

在本例中,小号和大于号用作比较运算符。但从预处理程序的角度来看,尖括号。

基本上是一回事。它无法知道第一种匹配的尖括号是模板实例化,而第二种情况只是一对比较运算符。甚至连编译器都不知道,因为我们还在进行预处理。编译尚未进行。