2012-03-23 92 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.也可以用模板來表示。一個模板確實表示一個語法樹,並且實例化它涉及到採用通用語法樹,填充參數化的未知比特以及使用生成的語法樹。