c++ - 什么是计算宏和语法宏

标签 c++ macros c-preprocessor

我正在阅读论文“An Object oriented preprocessor fit for C++”。

"http://www.informatik.uni-bremen.de/st/lehre/Arte-fakt/Seminar/papers/17/An%20Object-Oriented%20preprocessor%20fit%20for%20C++.pdf "

它讨论了三种不同类型的宏。

  1. 文本宏。//与 C 预处理器非常相似
  2. 计算宏//文本作为计算结果被替换
  3. 语法宏。//由表示语言一致结构的语法树替换的文本。

有人可以详细解释最后两种类型的宏吗? 它说内联函数和模板是计算宏的示例,如何?

最佳答案

查看 Willink 和 Muchnick 的论文所引用的 1966 年 Cheatham 的原始论文,我总结了如下不同的宏类型:

  1. 文本宏在扫描和解析之前进行文本替换。
  2. 句法宏在扫描和解析过程中被处理。调用语法宏会用另一段 AST 替换宏调用。
  3. 计算宏可以在扫描器和解析器构建 AST 后的任何时候发生。关键是此时我们不再处理任何文本,而是操纵 AST 的节点,即我们正在处理的对象甚至可能已经附加了语义信息。

我不是 C++ 内部专家,但我假设函数调用的内联和实例化模板是关于在语法树被正确编译所需的语义信息注释之前、期间和之后操作语法树,因为这两者似乎假设知道很多在扫描和解析期间未知的东西(比如类型信息以及是否有内联的东西是好的)。

关于c++ - 什么是计算宏和语法宏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9843182/

相关文章:

c++ - 无法编译返回 MPI::Comm 类型对象的函数

c# - #if(DEBUG) 和 log4net 行号源/运行时不匹配

C++ #define可变参数函数

c - 将参数反转为可变参数宏

c++ - FFT和IFFT的长度

C++ AMP 在硬件上崩溃 (GeForce GTX 660)

c++ - 是否有公式可以确定给定 BGR 值的整体颜色? (OpenCV 和 C++)

c++ - 有没有办法在不分配变量的情况下将字符串连接到数字?

c - 特定于函数的 C 宏是否应该在函数范围内定义和取消定义?

Vim:如何制作等待按键并使用它的宏/命令?