偶然的機(jī)會(huì),看到了下面的C代碼:
ISC_PLATFORM_NORETURN_PRE static void
library_fatal_error(const char *file, int line, const char *format,
va_list args)
ISC_FORMAT_PRINTF(3, 0) ISC_PLATFORM_NORETURN_POST;
其中ISC_PLATFORM_NORETURN_PRE 和ISC_PLATFORM_NORETURN_POST,ISC_FORMAT_PRINTF是宏。具體定義如下:
#define ISC_PLATFORM_NORETURN_PRE __declspec(noreturn)
#define ISC_PLATFORM_NORETURN_POST
#define ISC_FORMAT_PRINTF(fmt, args) __attribute__((__format__(__printf__, fmt, args)))(GCC中設(shè)置函數(shù)屬性、變量屬性、類型屬性的一種機(jī)制,用來(lái)設(shè)置在這個(gè)宏前面的有關(guān)函數(shù)的一些屬性)。
這段代碼是一個(gè)老外寫(xiě)的,編譯也沒(méi)有錯(cuò)誤;可這樣的語(yǔ)法卻很少見(jiàn)(在函數(shù)的末尾加上了一個(gè)空宏)。
這里ISC_PLATFORM_NORETURN_POST就是所謂的空宏,空宏(未定義的宏)都展開(kāi)為空字符串,但定義為空字符串的宏被視為是在預(yù)處理表達(dá)式定義的,一般的用法是在#ifdef/#endif和#ifndef/#endif的條件編譯語(yǔ)句中。#ifdef/#endif判斷ifdef后面的宏是否定義,如果定義了,則對(duì)下面的代碼或語(yǔ)句編譯,是有條件的編譯;#ifndef/#endif和#define配合使用,取消定義用undef宏,作用和#ifdef/#endif基本一樣。
但是像這樣
放在函數(shù)的末尾還是不多見(jiàn)的,在預(yù)編譯時(shí),空宏將被替換成一個(gè)空字符串,它的值是0.這里的空宏只是為了增加代碼的可讀性,起注釋、說(shuō)明的作用,其實(shí)完全可以不加的,完全可有可無(wú)的,但是加上了,看起來(lái)能更清晰些。;而且這兩個(gè)宏一般都是配對(duì)使用的(空宏也可以放在函數(shù)的開(kāi)頭)。