以下內容為本人的著作,如需要轉載,請宣告原文鏈接 微信公眾號「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系列語言的一大寶藏,好好挖掘,說不定可以挖出很多寶貝來,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/503090.html
標籤:其他
上一篇:第6章 分支陳述句和邏輯運算子
下一篇:C++ inline
