#define f(a,b) a##b
#define d(a) #a
#define s(a) d(a)
void main( void )
輸出結果:
f(a,b)
ab分析: ##把兩個符號連起來
#a指把a當成符號,就是把#後面的看成字串
# 和 ## 操作符是和#define巨集使用的. 使用# 使在#後的首個引數返回為乙個帶引號的字串. 例如, 命令
#define to_string( s ) # s
將會使編譯器把以下命令
cout < < to_string( hello world! ) < < endl;
理解為
cout < < "hello world!" < < endl;
使用##鏈結##前後的內容. 例如, 命令
#define concatenate( x, y ) x ## y
...
int xy = 10;
...
將會使編譯器把
cout < < concatenate( x, y ) < < endl;
解釋為
cout < < xy < < endl;
理所當然,將會在標準輸出處顯示'10'.
puts(d(f(a,b))); ----> 因為d巨集中的引數是另外乙個巨集,且帶##,所以作為引數的巨集不展開,相當於
puts(#f(a,b));----->puts("f(a,b)");
puts(s(f(a,b))); ----> 因為s巨集中的引數是另外乙個巨集,但不帶##,所以作為引數的巨集先展開,相當於
puts(s(ab));----->puts(d(ab));---->puts(#ab);---->puts("ab");
#define f(a,b) a##b
#define d(a) #a --》 以"#"開頭的,直接替換,不展開:immediately replaced by the unexpanded actual argument
#define s(a) d(a) --》 非以"#"開頭的,先展開,再替換,也就是一般的情況
所以就兩種情況:
1,不以"#"開頭的,先展開引數a,然後是替換**:puts(s(f(a,b)));-->puts(s(ab))-->puts(d(ab))-->puts("ab")
2,以"#"開頭的,直接替換,不展開:puts(d(f(a,b)))-->puts("f(a,b)")
define中 和 的作用
define f a,b a b define d a a define s a d a void main void 輸出結果 f a,b ab分析 把兩個符號連起來 a指把a當成符號,就是把 後面的看成字串 和 操作符是和 define巨集使用的.使用 使在 後的首個引數返回為乙個帶引號的字串....
談一談 define中 和 的作用
最近在閱讀大佬們寫的開源庫的時候,看到一些巨集定義,不是很明白它的用法,就查了很多資料,弄清楚它們的用法後,在這裡記錄一下。1 的作用 param指把param當成符號,就是把 後面的看成字串 define test1 param param include intmain int argc,cha...
define中 和 以及 VA ARGS
經常看到別人寫的 中define有特殊操作符 和 接下來就讓我們看看他們代表的具體意思 1 假如希望在字串中包含巨集引數,ansi c允許這樣作,在類函式巨集的替換部分,符號用作乙個預處理運算子,它可以把語言符號轉化程字串。例如,如果x是乙個巨集參量,那麼 x可以把引數名轉化成相應的字串。該過程稱為...