#與##在巨集定義中的--巨集展開
#include #define f(a,b) a##b
#define g(a) #a
#define h(a) g(a)
int main()
巨集展開時:
如果巨集定義以#開頭,不展開引數,直接替換。
故g(f(1,2))--->#f(1,2)--->"f(1,2)";
如果巨集定義不以#開頭,展開引數,直接替換,由外層向里層,如果碰到的是#開頭的巨集,不繼續往裡層展開,往外層展開。
由外層向里層,如果碰到的是以非#開頭的巨集,繼續往裡層走,直至最裡層,開始一層層往外層展開。
故h(f(1,2))--->h(12)--->g(12)---->#12----->"12"。
ps:##在巨集中定義,是字元連線符
如a##b##c 等同於"abc"
#在巨集開頭出現,是表示巨集展開的方式不同
#a 等同於"a"
#abc 等同於"abc"
複雜的:
#include #define f(a,b) a##b
#define g(a) #a
#define h(a) g(a)
int main()
/* 執行的結果:
* [root@bogon c_study]# ./hong巨集
* pi=3.140000
* area=314.000000
* tttt=nihao
* str=love111
* str=love11*/
注意事項:
在我寫程式的時候開始是直接用str(11)去當右值給別人,gcc提示說love11未定義,如果直接這樣寫str(11)執行後會生成love11但是沒有任何型別
需要用t()轉換下為字元型的才行,這點糾結了一會!
c語言 巨集中 的用法(續)
如下 不明覺厲。define ext2 debug f,a.特別是其中printf f,a 這樣的用法。google之後在stackoverflow找到了這個問題以及解答。詳細的解答跳轉到了gnu的gcc文件 譯文如下 3.6 variadic macros 可變引數的巨集 乙個巨集可以像乙個函式一...
C 巨集中 的用法
c語言中的巨集是乙個很簡單粗暴的設計,主要功能就是replace。為了更方便地替換,引入了巨集函式這一概念。巨集函式用引數替換預先定義的識別符號在巨集定義中的每一次出現。配合 和 可以用巨集簡單高效地完成一些複雜的操作。稱之為字串化操作符 stringizing operator 它將函式巨集的實際...
C語言巨集中 和 的用法
c語言巨集中 和 的用法 一 一般用法 我們使用 把巨集引數變為乙個字串,用 把兩個巨集引數貼合在一起.用法 include include using namespace std define str s s define cons a,b int a e b int main printf st...