以下內容為本人的著作,如需要轉載,請聲明原文鏈接 微信公眾號「englyf」https://www.cnblogs.com/englyf/p/16637890.html 如果不是機緣巧合,當年轉到C++之後,恐怕很難再有機會還寫C的代碼。面向對象在現代coding中,就像聖經一樣,在碼農的口中自帶光 ...
以下內容為本人的著作,如需要轉載,請聲明原文鏈接 微信公眾號「englyf」https://www.cnblogs.com/englyf/p/16637890.html
如果不是機緣巧合,當年轉到C++之後,恐怕很難再有機會還寫C的代碼。面向對象在現代coding中,就像聖經一樣,在碼農的口中自帶光環,code起來左一個語法糖,右一個範式編程,各種眼花繚亂。主業要是還用C,都不好意思出去吹牛逼,要啥特性就沒啥特性,隨便一聊,大伙親切地給你起一個名號--骨灰級碼農,就問你尷尬不?
嗯,最近在閱讀晶元原廠的行業應用方案常式代碼時,發現有趣的是,裡邊除了腳本,所有工程代碼一律是用C語言。原本還想著觀摩一下雜技團表演,結果是一本漫畫走天涯哈,真是史前怪獸出沒。不過,代碼很精巧,值得一讀。十足的開局給你一把刀,防身工具只能說是簡陋,結果玩出了屠龍刀的花樣。
其中看到了給函數添加形參的預設值,猛一驚覺,這在高級語言使用過程中太常見了,但C語言本身是不支持的這種玩法的。
那麼用什麼辦法實現?
其中一個方法就是用巨集定義繞過函數的限制。
下麵看代碼,聽我徐徐道來。
先定義的一個被執行的函數
void _fun(int val)
{
printf("fun input val:%d", val);
}
但是我想在調用函數時不輸入參數,希望系統輸入預設的參數值。
定義一個可變參的巨集定義
#define fun(...) _fun((default_val, ##__VA_ARGS__));
輸入給_fun的參數形式上是(default_val, ##__VA_ARGS__)
,其中的default_val
就是我們設定的參數預設值,預設值類型應該和_fun的形參類型一致。
調用fun巨集定義時,如果沒有輸入參數,##
會把(default_val, ##__VA_ARGS__)
變成(default_val)
,那麼實際輸入給_fun的參數就變成了(default_val)
;如果有輸入參數,比如數值A,由於逗號運算符的運算優先順序會把逗號後邊的值輸出返回,(default_val, ##__VA_ARGS__)
變成(A)
,那麼實際輸入給_fun的參數就變成了(A)
。
看一下實際的例子,由於_fun的實際形參類型為int類型,那麼把default_val
(形參預設值)改為123測試一下
#include <stdio.h>
#define fun(...) _fun((123, ##__VA_ARGS__));
void _fun(int val)
{
printf("fun input val:%d", val);
}
int main()
{
fun();
printf("\r\n---\r\n");
fun(321);
}
執行結果
fun input val:123
---
fun input val:321
好了,看了輸出結果,效果還是蠻不錯的。
巨集定義是C系列語言的一大寶藏,好好挖掘,說不定可以挖出很多寶貝來。