C語(yǔ)言中沒(méi)有參數(shù)默認(rèn)值的概念,但其實(shí)可以利用宏來(lái)模擬參數(shù)的默認(rèn)值;
我們之前介紹過(guò)可變參數(shù)宏與逗號(hào)運(yùn)算符,將兩者相結(jié)合的話可以定義出以下形式的宏:
#define func(...) __func((default, ##__VA_ARGS__))
當(dāng)在func()里不填寫(xiě)任何內(nèi)容的時(shí)候,正常情況下宏展開(kāi)后會(huì)是func((default,)),但由于##__VA_ARGS__會(huì)將前面多余的逗號(hào)忽略,所以宏展開(kāi)后就相當(dāng)于__func((default));
當(dāng)在func()括號(hào)里填寫(xiě)有效值的時(shí)候,根據(jù)逗號(hào)運(yùn)算符的值等于最后一個(gè)表達(dá)式的值的性質(zhì),宏會(huì)被展開(kāi)為_(kāi)_func((##__VA_ARGS__))既default被丟棄,傳入的值只有我們填寫(xiě)的內(nèi)容,通過(guò)這個(gè)技巧我們就可以設(shè)計(jì)出一個(gè)帶有默認(rèn)參數(shù)的函數(shù)。
示例:
定義一個(gè)函數(shù)默認(rèn)參數(shù)為0xff,不傳任何參數(shù)的時(shí)候打印0xff,傳入有效值的時(shí)候就打印我們傳入的內(nèi)容;
#include <stdio.h>
#define func(...) __func((0xff, ##__VA_ARGS__))
void __func(int value)
{
printf("value: %drn", value);
}
void main(void)
{
func();
func(100);
}
輸出:
value: 255
value: 100