#include<stdio.h> #define f(a,b) a##b #define g(a) #a #define h(a) g(a) int main() { printf("%s\n",h(f(1,2))); 宏h(a) 是g(a),沒有#,所以需要進行宏展開 printf("%s\n",g(f(1,2))); //宏g(a) 有#,所以不展開 return 0; }
如何展開宏函數的規則:在展開當前宏函數時,如果形參有#或##則不進行宏參數的展開,否則先展開宏參數,再展開當前宏。
萬能的stackoverflow
http://stackoverflow.com/questions/1686324/how-does-this-c-code-work
http://stackoverflow.com/questions/4364971/and-in-macros
http://zjf30366.blog.163.com/blog/static/411164582009061075923/
分析:
x##y把兩個符號連起來 xy
#a指把a當成符號,就是把#后面的看成字符串
#define f(a,b) a##b #define g(a) #a #define h(a) g(a)
printf("%s\n",h(f(1,2))); //結果12
//因為h宏中的參數是另外一個宏,且帶##,所以作為參數的宏不展開
printf("%s\n",g(f(1,2))); //結果f(1,2)
//因為g宏中的參數是另外一個宏,但不帶##,所以作為參數的宏先展開
在展開當前宏函數時,如果形參有#或##則不進行宏參數的展開,否則先展開宏參數,再展開當前宏。