2016-01-06 62 views
2

假設我有定義爲C++預處理器宏如下:使用預處理宏組成另一個宏調用

#define X(s) std::cout << #s 

,如果我直接使用它:

int main() { 
    X(hello); 
} 

它的預期,「你好」的作品打印在控制檯上。

如果我定義調用它另一個宏:

#define Y X(hello) 
#define X(s) std::cout << #s 

int main() { 
    Y; 
} 

它仍然有效。

但是,如果我嘗試從兩個或多個不同的宏撰寫調用X,我得到的錯誤的一大堆:

#define A X(
#define B hello 
#define C) 

#define X(s) std::cout << #s << '\n' 


int main() 
{ 
    A B C; 
} 

在見輸出:http://cpp.sh/5ws5k

爲什麼我不能由兩個或多個宏擴展組成宏調用,預處理程序是否不會遞歸地擴展它們?

+1

您應該閱讀描述[C++預處理程序](https://en.wikipedia.org/wiki/C_preprocessor)的文檔,可能是C++ 11或C99標準。它不會像你在做夢一樣。 –

+0

我不知道你在這裏試圖實現什麼...... – Samer

回答

5

爲什麼我不能從兩個或多個宏擴展組成一個宏調用,不會預處理器遞歸地擴展它們?

您可以撰寫宏。預處理器會遞歸地擴展宏。

但是,它不首先擴展宏的寬度。它首先擴展它們的深度。

由於您希望預處理器先擴展宏寬度,因此您遇到了問題。

有關遞歸宏擴展的更多信息,請參閱16.3.4 C++ 11標準的重新掃描和進一步替換

+2

相關的C++標準報價:16.3.4重新掃描和進一步替換 – imreal

+0

至於「深度」和「寬度」,預處理器同時執行這兩個操作。將開放的paren從'A'移動到'B',並給出'#define I(Q)Q',並使用'I(ABC)',它[作品](http://coliru.stacked-crooked.com/A/ffc76f2b99c9c45a)。 – Potatoswatter