#defineA"menu"#defineB"osd"#defineSTRABintmain(inta" />

欧美三区_成人在线免费观看视频_欧美极品少妇xxxxⅹ免费视频_a级毛片免费播放_鲁一鲁中文字幕久久_亚洲一级特黄

關于宏##的使用注意一點

系統 1832 0

在看《C語言高級編程》時,里面有個關于宏##的題目:

      
        1.已知#define A “menu”

#define B “osd”,

若請使用宏A,B表示出字符串”menuosd”



答案:1 答案1:#define C A B

答案2:#define _C_(a,b) a##b

#define C(a,b) _C_(a,b)
      
    

?

然后我實際動手測試了一下,先來第一種:

      #include <stdio.h>


      
        #define
      
       A "menu"


      
        #define
      
       B "osd"


      
        #define
      
       STR A B




      
        int
      
       main(
      
        int
      
       argc, 
      
        char
      
       *
      
        argv[])

{


      
      
        char
      
       *p =
      
         STR;


      
      
        return
      
      
        0
      
      
        ;

}
      
    
      gcc -E hell.c -
      
        o hello.i

cat hello.i
      
    

結果:

      
        int main(int argc, char *argv[])

{





char *p = "menu" "osd";





return 0;

}
      
    

?

第一個答案其實預編譯后給出的結果是不完全符合要求的。

然后是第二種:

      #include <stdio.h>


      
        #define
      
       A "menu"


      
        #define
      
       B "osd"




      
        #define
      
       _C_(a,b) a##b


      
        #define
      
       C(a,b) _C_(a,b)




      
        int
      
       main(
      
        int
      
       argc, 
      
        char
      
       *
      
        argv[])

{


      
      
        char
      
       *p =
      
         C(A,B);

printf(
      
      
        "
      
      
        %s\n
      
      
        "
      
      
        , p);


      
      
        return
      
      
        0
      
      
        ;

}
      
    

?

首先,為什么要定義兩個宏,一個不能解決問題嗎?是的,不能。為什么?看這個鏈接:[ 短小精悍的宏 ](http://www.cnblogs.com/wb-DarkHorse/archive/2013/04/27/3046749.html)
然后再次按照上邊的命令進行預編譯,但是給出了錯誤信息: pasting "menu" and "osd" does not give a valid preprocessing token gcc
這就奇怪了。然后google了一下,發現了相同的問題:
[ 問題 ](http://stackoverflow.com/questions/4667779/preprocessor-macro-gcc-pasting-x-and-x-does-not-give-a-valid-preprocessing-toke)

并且里面說了,這種情況在VS里面不會報錯,可以直接工作。so?

      #include <stdio.h>


      
        #define
      
       A "menu"


      
        #define
      
       B "osd"




      
        #define
      
       _C_(a,b) a##b


      
        #define
      
       C(a,b) _C_(a,b)




      
        int
      
       _tmain(
      
        int
      
       argc, _TCHAR*
      
         argv[])

{


      
      
        char
      
       *p = C(A,B);
      
        //
      
      
        STR;
      
      

printf(
      
        "
      
      
        %s\n
      
      
        "
      
      
        , p);


      
      
        return
      
      
        0
      
      
        ;

}
      
    

?

果然給出了結果: menuosd

為什么gcc和VS會對這個問題給出差異的結果呢?看這個問題:
[ that's why ](http://stackoverflow.com/questions/1206624/differences-in-macro-concatenation-operator-between-visual-c-and-gcc?rq=1)

根據C標準,用##操作后的結果必須是一個已經預定義過的符號。否則是未定義的。所以gcc和vs對于這個未定義行為表示了不同的看法,前者是給出錯誤,后者一笑而過。那什么是已經預定過的符號呢? 它包含了這些:頭文件名, 等式, 預處理數字, 字符常數, 字符串值, 標點符號, 單個非空字符

在我們的例子中,_C_(a,b)用##連接后,應該是產生menuosd,但是這是一個未預定義的字符串,所以產生了一個未定義的行為。我們再看一個例子:

      
        #define
      
       A 2


      
        #define
      
       _CONS(a,b) (a##e##b)


      
        #define
      
       CONS(a,b) _CONS(a,b)




      
        int
      
       main(
      
        int
      
       argc, 
      
        char
      
       *
      
        argv[])

{

printf(
      
      
        "
      
      
        %f\n
      
      
        "
      
      
        , CONS(A, A));


      
      
        return
      
      
        0
      
      
        ;

}
      
    

?

這個時候gcc不會給出錯誤提示了。結果:200.0000
為什么這個時候不給出錯誤提示呢?我的理解是,CONS(A, A)替換后成為2e2,而這時一個常量,符合C標準。

ok,給出一個鏈接,詳細的解釋了gcc中##的用法:
[ gcc concatenation ](http://gcc.gnu.org/onlinedocs/gcc-4.3.3/cpp/Concatenation.html#Concatenation)

?

?

關于宏##的使用注意一點


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 9久9久女女热精品视频免费观看 | 欧美伊人 | 国产亚洲精品久久久久久一区二区 | caoliusequ| 欧美精品黄页免费高清在线 | 狠狠的撸2015最新版狠狠的撸2015最新版 | 日日欧美 | 亚洲精品国精品久久99热 | 国产黄在线观看免费观看软件视频 | 亚洲欧美日韩国产精品26u | 一二三区av | 欧美精品黄页在线观看大全 | 久久经典视频 | 欧美日本一区视频免费 | 国产精品揄拍100视频最近 | 国产目拍亚洲精品区一区 | 免费的黄网站男人的天堂 | 亚洲精品综合 | 在线看亚洲 | 蜜桃精品噜噜噜成人av | 欧美日韩一区二区三区在线观看 | 久久久伊人色综合A片无码 国产精品区一区二区三 | 毛片a片 | 天天鲁天天爽天天视频 | 国产日韩一区二区 | 欧美日韩综合在线视频免费看 | 欧美成人精品激情在线观看 | 成人自拍视频网 | 中文字幕日韩在线 | 日日狠日 | 久久成人免费网 | 久草综合在线视频 | 欧美激情在线精品一区二区 | 成年做羞羞免费观看视频网站 | 很黄很色又爽很黄很色又爽 | 国产精品大片在线观看 | 中文字幕亚洲欧美 | 久久国产视频网站 | 高清中文字幕视频在线播 | 日日干天天摸 | 91精品国产综合久久久久蜜臀 |