2012-03-23 80 views
0

我正在阅读“适用于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. 语法宏。 //由语法树替代的文本代表语言上一致的结构。

有人可以请一个精心制作的方式解释最后两种类型的宏。它说,内联函数和模板是计算宏的例子,怎么样?

回答

1

纵观1966年原奇塔姆的纸张的Willink的和Muchnick的论文是指我总结了不同的宏类型是这样的:

  1. 文本宏扫描和解析之前做的文本替换。
  2. 语法宏在扫描和解析过程中被处理。调用语法宏将用另一条AST代替宏调用。
  3. 计算宏可以在AST由扫描器和解析器构建之后的任何时候发生。重点是,在这一点上,我们不再处理任何文本,而是操纵AST的节点,即我们正在处理可能已经附加有语义信息的对象。

我没有C++内部的专家,但我认为的函数调用和实例化模板的内联约为前操纵语法树,而之后它被标注了必要的语义信息来正确编译为这两个人似乎都认为知道很多东西(比如类型信息以及是否有内联的东西),这在扫描和解析过程中还不知道。

+0

感谢您的回复..我几天前还看了报纸。 – 2012-04-15 02:46:06

1

2.它听起来像是说它们意味着某些计算是在编译时完成的,并且在运行时执行的结果指令只涉及结果。我不认为内联函数特别代表这一点,但模板元编程正是这样做的。在C++ 11中也是constexpr

我觉得3.也可以用模板来表示。一个模板确实表示一个语法树,并且实例化它涉及到采用通用语法树,填充参数化的未知比特以及使用生成的语法树。