日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

宏定义中#号和##号的使用

發布時間:2025/4/5 编程问答 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 宏定义中#号和##号的使用 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

在技術群中有人提了一個問題:如何定義一個宏,打印傳遞過來的參數的地址。這很簡單,像下面這樣

[objc]?view plaincopy
  • #define?pl(param)??NSLog(@"參數地址---%p",param)??
  • 這樣調用 ?pl(self) ? 將會打印 ?

    [objc]?view plaincopy
  • 參數地址---0xXXXXXXXX??
  • 在此基礎上,提問的人希望調用 pl(self)打印出

    [objc]?view plaincopy
  • self參數地址---0xXXXXXXXX??
  • 這時就需要用到#運算符

    [objc]?view plaincopy
  • #define?pl(param)??NSLog(@"%s參數地址---%p",#param,param)??
  • 在這個例子中可以看出,單井號(#)在宏定義中的作用就是 ?把傳遞過來的參數當成字符串進行替換

    雙井號(##)又稱連接符,它的作用就是 將參數和前面或后面的子串連接起來,成為一個新的子串所謂的子串(token)就是指編譯器能夠識別的最小語法單元。比如下面的例子

    [objc]?view plaincopy
  • #define?GENERIC_MAX(type)?????-(type)?type##_max:(type)x?:(type)y?{return?x?>?y???x?:?y;}??
  • 這個宏定義可以用于定義不同類型的數值比較函數,當有了以上的宏定義時,再加上下面的宏定義

    [objc]?view plaincopy
  • GENERIC_MAX(float)??
  • GENERIC_MAX(int)??
  • GENERIC_MAX(double)??
  • 預處理器將會自動展開出以下代碼

    [objc]?view plaincopy
  • -(float)?float_max:(float)x?:(float)y?{return?x?>?y?x:y;}??
  • -(int)?int_max:(int)x?:(int)y?{return?x?>?y???x?:?y;}??
  • -(double)?double_max:(double)x?:(double)y?{return?x?>?y???x?:?y;}??
  • 類似的例子還有
    [objc]?view plaincopy
  • #define?pl(id)??NSLog(@"value?=%d",age##id)??
  • [objc]?view plaincopy
  • int?age1?=?10;??
  • pl(1);??
  • 將會打印
    [objc]?view plaincopy
  • value?=10??
  • 總結

    以上是生活随笔為你收集整理的宏定义中#号和##号的使用的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。