什么是计算宏和语法宏

时间:2012-03-23 16:47:58

标签: c++ macros c-preprocessor

我正在阅读论文“面向对象的预处理器适合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. 计算宏//作为计算结果替换的文本
  4. 语法宏。 //由语法树替换的文本表示语言上一致的构造。
  5. 有人可以用精心设计的方式解释最后两种类型的宏。 它说内联函数和模板是计算宏的例子,如何?

2 个答案:

答案 0 :(得分:1)

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

我认为3.也可以通过使用模板来表示。模板确实表示语法树,并且实例化它涉及获取通用语法树,填充参数化的未知位,并使用生成的语法树。

答案 1 :(得分:1)

看看1966年Cheatham的原始论文,Willink和Muchnick的论文提到我总结了这样的不同宏类型:

  1. 文本宏在扫描和解析之前进行文本替换。
  2. 在扫描和解析期间处理语法宏。调用语法宏将宏调用替换为另一个AST。
  3. 计算宏可以在扫描程序和解析器构建AST之后的任何时刻发生。关键在于,此时我们不再处理任何文本,而是操纵AST的节点,即我们正在处理可能已经附加了语义信息的对象。
  4. 我不是C ++内部专家,但是我假设函数调用和实例化模板的内联是关于操作语法树之前,之后和之后使用语义信息进行注释,以便正确编译它们。似乎认为在扫描和解析过程中还不知道很多东西(比如类型信息以及内容是否良好)。