天天看點

c語言帶預設參數嗎,嵌入式C語言可以帶“預設參數”的函數嗎

(文章來源:嵌入式時代)

使用C++開發過程式時,定義函數可以指定預設參數,例如 void fun(int x, int y=3); 在調用 fun() 時第二個參數可以不傳遞,此時 fun() 函數預設第二個參數等于 3,例如 f(1) 就相當于 f(1,3)。這是一個很好用的特性,那麼在C語言程式開發中,是否也可以定義帶“預設參數”的函數呢?

首先應該清楚,目前C語言還沒有原生支援帶預設參數的函數,也就是說下面這樣的C語言代碼是非法的:void fun(int x, int y =3){return x+y;}fun(1); // 不等價于 fun(1, 3)。

c語言帶預設參數嗎,嵌入式C語言可以帶“預設參數”的函數嗎

但是,C語言作為一門極其靈活的程式設計語言,又的确可以借助其他基本文法實作這樣的需求。不過要在C語言中定義帶“預設參數”的函數可能略微有些繁瑣,當然了,方法可能不止一種,本文不打算從枯燥的理論層面讨論這些方法,而是給出一個執行個體,希望能夠起到抛磚引玉的作用。

假設我們希望在某段C語言程式中定義一個帶預設參數的函數,它可以接收兩個參數,并将之列印出來:double f(int i, double x){printf("i=%d, x=%0.2f\n", i, x);return x;}。現在期望調用 f 時,如果不顯式指定參數,f 的兩個預設參數為 (i=8, x=3.14),例如:f(); // 輸出 i=3, x=3.14f(1); // 輸出 i=1, x=3.14f(2, 6.28); // 輸出 i=2,x=6.28。

C語言自然沒有支援這種需求的原生文法,但是為了實作這樣的目的,可以定義下面這個結構體,請看相關C語言代碼:typedef struct {i;double x; f_args。接着,定義 f_base() 函數,它的C語言代碼實作和 f() 是一樣的,目的是讓 f_base() 函數具有期望的 f() 函數功能。

顯然,從上述C語言代碼來看,var_f() 函數實作了預設參數的功能。現在再定義一個帶可變參數的宏,這樣一來,調用者就不必知道結構體 f_args 的結構了:#define f(...) var_f((f_args){__VA_ARGS__})。上述C語言代碼在 main() 函數中調用 f() 函數,并分别傳遞了不同的參數,編譯并執行之,得到如下結果:# gcc t.c# ./a.outi=3, x=8.00i=1, x=2.30i=2, x=3.14i=8, x=9.20。

可見,C語言是一門極其簡潔靈活的程式設計語言,其他程式設計語言中一些好用的特性,可能C語言沒有原生文法支援,但是我們卻可以組合其他基本文法,自己實作這些好用的特性。不過應該注意,有件事是行不通的——f(0),因為上述實作我們無法在 var_f() 中區分 “0”究竟是調用者傳遞的,還是預設值,不過我相信聰明的讀者應該能夠想到解決這樣的問題的方法。