[轉載ios 宏]

define PLAYSOUNDEFFECT(...) [[GameManager sharedGameManager] playSoundEffect:@#VA_ARGS]

這樣的代碼你能看懂嗎?
看懂了你就是高手了 哈哈
(轉載 http://blog.csdn.net/songrotek/article/details/8929963)
1 關于宏的定義
A macro
is a fragment of code which has been given a name. Whenever the name is used, it is replaced by the contents of the macro. There are two kinds of macros. They differ mostly in what they look like when they are used. Object-like
macros resemble data objects when used, function-like
macros resemble function calls.
有兩種宏的類型控嗜,一種是類對象的宏浸策,封裝使用的數(shù)據(jù)對象,另一種是類函數(shù)的宏,封裝函數(shù)的調(diào)用起便。在ObjC里面鲸沮,那就是可以封裝Method的使用,如文章一開始的代碼
1.1 類對象的宏
最基本的使用:

define BUFFER_SIZE 1024

foo = (char *) malloc (BUFFER_SIZE);

foo = (char *) malloc (1024);

就是最基本的替換煌往。

通常宏的名稱都是用大寫字母。


define NUMBERS 1, \

            2, \  
            3  

int x[] = { NUMBERS };
==> int x[] = { 1, 2, 3 };

在宏定義中轧邪,如果要換行刽脖,使用“"符號。然后經(jīng)預處理后還是在同一行闲勺。


C預處理器是按順序讀取程序曾棕,因此宏定義生效在宏定義之后。
foo = X;

define X 4

bar = X;
ces

foo = X;
bar = 4;


宏調(diào)用時菜循,預處理器在替換宏的內(nèi)容時翘地,會繼續(xù)檢測內(nèi)容本身是否也是宏定義,如果是癌幕,會繼續(xù)替換內(nèi)容衙耕。

define TABLESIZE BUFSIZE

define BUFSIZE 1024

TABLESIZE
==> BUFSIZE
==> 1024


宏定義以最后生效的定義為準,因此下面的代碼TABLESIZE對應37

define BUFSIZE 1020

define TABLESIZE BUFSIZE

undef BUFSIZE

define BUFSIZE 37


如果宏定義內(nèi)容包含了名稱勺远,則預處理器會終止展開防止無限嵌套(infinite resursion)
1.2 類函數(shù)宏

define lang_init() c_init()

lang_init()
==> c_init()

類函數(shù)宏的名稱后面加了"()"橙喘。

define lang_init () c_init()

lang_init()
==> () c_init()()

并且"()"必須緊隨在名稱后面否則就會認為是類對象宏。

1.3 宏參數(shù)
在類函數(shù)宏里面可以添加參數(shù)使得更像真正的函數(shù)
  #define min(X, Y) ((X) < (Y) ? (X) : (Y))
   x = min(a, b); ==> x = ((a) < (b) ? (a) : (b));
   y = min(1, 2); ==> y = ((1) < (2) ? (1) : (2));
   z = min(a + 28, p); ==> z = ((a + 28) < (p) ? (a + 28) : (*p));

基本的使用和函數(shù)的定義類似胶逢,當然宏里面都是實際參數(shù)厅瞎,用逗號隔開。預處理時初坠,先是將宏展開和簸,然后將參數(shù)放進宏的主體中,再檢查一遍完整的內(nèi)容碟刺。


如何宏里面有字符串的內(nèi)容锁保,即使與參數(shù)名相同,也不會被替換。如下:
   foo(bar) ==> bar, "x"

1.4 字符串化

使用”#“預處理操作符來實現(xiàn)將宏中的參數(shù)轉化為字符串爽柒。例子如下:
  #define WARN_IF(EXP) \
  do { if (EXP) \
fprintf (stderr, "Warning: " #EXP "\n"); } \
  while (0)
  WARN_IF (x == 0);
   ==> do { if (x == 0)
fprintf (stderr, "Warning: " "x == 0" "\n"); } while (0);

這個字符串化會將參數(shù)中的所有字符都實現(xiàn)字符串化吴菠,包括引號。如果參數(shù)中間有很多空格浩村,字符串化之后將會只用一個空格代替做葵。

然后沒有什么方法可以直接將參數(shù)轉化成單一的字符char

define xstr(s) str(s)

define str(s) #s

define foo 4

str (foo)
==> "foo"
xstr (foo)
==> xstr (4)
==> str (4)
==> "4"

出現(xiàn)上面的結果是因為在使用str(s)時,s是字符串化心墅,所以宏沒有擴展開蜂挪。而使用xstr(s)時s作為一個參數(shù),因此先把宏完全擴展然后再放進參數(shù)嗓化。

1.5 連接
使用"##"操作符可以實現(xiàn)宏中token的連接。
struct command
{
char name;
void (
function) (void);
};

struct command commands[] =
{
{ "quit", quit_command },
{ "help", help_command },
...
};

define COMMAND(NAME) { #NAME, NAME ## _command }

struct command commands[] =
{
COMMAND (quit),
COMMAND (help),
...
};

如上谬哀,使參數(shù)NAME對應的字符與_command連接起來刺覆,而不進行其他轉化。當然要注意連接后的字符必須是有意義的史煎,否則只會出現(xiàn)錯誤或警告谦屑。然后C預處理器會將注釋轉化成空格,因此在宏中間篇梭,參數(shù)中間加入注釋都是可以的氢橙。但不能將"##"放在宏的最后,否則會出現(xiàn)錯誤恬偷。1.6 多參數(shù)宏(Variadic Macros)

define eprintf(...) fprintf (stderr, VA_ARGS)

eprintf ("%s:%d: ", input_file, lineno)
==> fprintf (stderr, "%s:%d: ", input_file, lineno)

使用標識符_VA_ARGS來表示多個參數(shù)悍手,在宏的名稱中則使用(...)在C++中也可以使用如下的方式:

define eprintf(args...) fprintf (stderr, args)

結果是一樣的。------------------------------------------------------------------------------------------------"##"的特殊用法:
  #define eprintf(format, ...) fprintf (stderr, format, ##VA_ARGS)
  eprintf ("success!\n")
   ==> fprintf(stderr, "success!\n");

將"##"放在","和參數(shù)之間袍患,那么如果參數(shù)留空的話坦康,那么"##"前面的","就會刪掉,從而防止編譯錯誤诡延。1.7 取消或重新宏定義這個看下面的代碼就明白:
   #define FOO 4
x = FOO;
==> x = 4;
#undef FOO
x = FOO; ==> x = FOO;
  These definitions are effectively the same:
#define FOUR (2 + 2)
#define FOUR (2 + 2)
#define FOUR (2 /* two */ + 2)
  but these are not:
#define FOUR (2 + 2)
#define FOUR ( 2+2 )
#define FOUR (2 * 2)
#define FOUR(score,and,seven,years,ago) (2 + 2)

對于重定義滞欠,如果定義的宏不一樣,那么編譯器會給出警告并使用最新定義的宏肆良。

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末筛璧,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子惹恃,更是在濱河造成了極大的恐慌夭谤,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,539評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件座舍,死亡現(xiàn)場離奇詭異沮翔,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,594評論 3 396
  • 文/潘曉璐 我一進店門采蚀,熙熙樓的掌柜王于貴愁眉苦臉地迎上來疲牵,“玉大人,你說我怎么就攤上這事榆鼠「侔郑” “怎么了?”我有些...
    開封第一講書人閱讀 165,871評論 0 356
  • 文/不壞的土叔 我叫張陵妆够,是天一觀的道長识啦。 經(jīng)常有香客問我,道長神妹,這世上最難降的妖魔是什么颓哮? 我笑而不...
    開封第一講書人閱讀 58,963評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮鸵荠,結果婚禮上冕茅,老公的妹妹穿的比我還像新娘。我一直安慰自己蛹找,他們只是感情好姨伤,可當我...
    茶點故事閱讀 67,984評論 6 393
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著庸疾,像睡著了一般乍楚。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上届慈,一...
    開封第一講書人閱讀 51,763評論 1 307
  • 那天徒溪,我揣著相機與錄音,去河邊找鬼拧篮。 笑死词渤,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的串绩。 我是一名探鬼主播缺虐,決...
    沈念sama閱讀 40,468評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼礁凡!你這毒婦竟也來了高氮?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,357評論 0 276
  • 序言:老撾萬榮一對情侶失蹤顷牌,失蹤者是張志新(化名)和其女友劉穎剪芍,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體窟蓝,經(jīng)...
    沈念sama閱讀 45,850評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡罪裹,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,002評論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片状共。...
    茶點故事閱讀 40,144評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡套耕,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出峡继,到底是詐尸還是另有隱情冯袍,我是刑警寧澤,帶...
    沈念sama閱讀 35,823評論 5 346
  • 正文 年R本政府宣布碾牌,位于F島的核電站康愤,受9級特大地震影響,放射性物質發(fā)生泄漏舶吗。R本人自食惡果不足惜征冷,卻給世界環(huán)境...
    茶點故事閱讀 41,483評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望誓琼。 院中可真熱鬧人断,春花似錦位他、人聲如沸趟咆。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,026評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽筐带。三九已至,卻和暖如春缤灵,著一層夾襖步出監(jiān)牢的瞬間伦籍,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,150評論 1 272
  • 我被黑心中介騙來泰國打工腮出, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留帖鸦,地道東北人。 一個月前我還...
    沈念sama閱讀 48,415評論 3 373
  • 正文 我出身青樓胚嘲,卻偏偏與公主長得像作儿,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子馋劈,可洞房花燭夜當晚...
    茶點故事閱讀 45,092評論 2 355

推薦閱讀更多精彩內(nèi)容

  • http://www.open-open.com/lib/view/open1390651437117.html ...
    Xtuphe閱讀 1,267評論 0 10
  • 一直以來用宏定義#define也就是定義一些簡單的常量妓雾,至多也就是定義一個函數(shù)娶吞,很少關注宏定義的用法。直到看到這樣...
    ant_flex閱讀 2,007評論 0 3
  • 宏定義在C系開發(fā)中可以說占有舉足輕重的作用械姻。底層框架自不必說妒蛇,為了編譯優(yōu)化和方便,以及跨平臺能力,宏被大量使用绣夺,可...
    你好自己閱讀 1,054評論 0 5
  • C中的預編譯宏定義 2009-02-10 作者: infobillows 來源:網(wǎng)絡 在將一個C源程序轉換為可執(zhí)行...
    白水灬煮一切閱讀 1,595評論 0 5
  • 實驗班開課兩周之后吏奸,我和孩子們的交流也越來越多了。無論是從學習風格測試的結果來看乐导,還是從我對他們的主觀感知來...
    shinezs閱讀 152評論 0 0