C語言中的宏展開


#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宏中的參數是另外一個宏,但不帶##,所以作為參數的宏先展開
在展開當前宏函數時,如果形參有#或##則不進行宏參數的展開,否則先展開宏參數,再展開當前宏。

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM