簡體   English   中英

宏串聯和進一步擴展

[英]Macro concatenation and further expansion

我可以安全地期待這個嗎

#define TEMPLATE_DECL_BEGIN_0 template <
#define TEMPLATE_DECL_BEGIN_1 TEMPLATE_DECL_BEGIN_0 typename Arg0
#define TEMPLATE_DECL_BEGIN_2 TEMPLATE_DECL_BEGIN_1 , typename Arg1
#define TEMPLATE_DECL_BEGIN_3 TEMPLATE_DECL_BEGIN_2 , typename Arg2
#define TEMPLATE_DECL(N) TEMPLATE_DECL_BEGIN_ ## N >

TEMPLATE_DECL(0)
TEMPLATE_DECL(1)
TEMPLATE_DECL(2)
TEMPLATE_DECL(3)

產生

template < >
template < typename Arg0 >
template < typename Arg0 , typename Arg1 >
template < typename Arg0 , typename Arg1 , typename Arg2 >

在任何合理的標准C預處理器上?

我擔心的是在先前替換之后的級聯之后的宏擴展:它是否起作用,以便例如在N被替換為2之后

TEMPLATE_DECL_BEGIN_2

TEMPLATE_DECL_BEGIN_1 , typename Arg1

是。 根據C99標准的6.10.3.3§3:

對於類對象和類函數宏調用,在重新檢查替換列表以查找更多要替換的宏名稱之前,刪除替換列表中的##預處理令牌的每個實例(而不是從參數中刪除),並且前面的預處理令牌與以下預處理令牌連接。

和6.10.3.4§3:

在替換列表中的所有參數都已被替換並且#和##處理已經完成之后,所有地標預處理令牌都將被刪除。 然后,對生成的預處理令牌序列以及源文件的所有后續預處理令牌進行重新掃描,以替換更多的宏名稱。

該標准保證x ## y在替換更多的宏名稱之前發生,因此,如果在那時構造一個宏名稱,它將被替換。

這是來自C99標准的,但是我非常懷疑他們是否從C89標准更改了此部分,而C89標准才是真正適用於C ++的版本。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM