使用C++開發過程序時,定義函數可以指定默認參數,例如 void fun(int x, int y=3); 在調用 fun() 時第二個參數可以不傳遞,此時 fun() 函數默認第二個參數等於 3,例如 f(1) 就相當於 f(1,3)。這是一個很好用的特性,那麼在C語言程序開發中,是否也可以定義帶“默認參數”的函數呢?
使用C++開發過程序時,定義函數可以指定默認參數,例如 void fun(int x, int y=3); 在調用 fun() 時第二個參數可以不傳遞,此時 fun() 函數默認第二個參數等於 3,例如 f(1) 就相當於 f(1,3)。這是一個很好用的特性,那麼在C語言程序開發中,是否也可以定義帶“默認參數”的函數呢?
有“默認參數”的C語言函數
首先應該清楚,目前C語言還沒有原生支持帶默認參數的函數,也就是說下面這樣的C語言代碼是非法的:
void fun(int x, int y =3)
{
return x+y;
}
fun(1); // 不等價於 fun(1, 3)
但是,C語言作為一門極其靈活的編程語言,又的確可以藉助其他基本語法實現這樣的需求。不過要在C語言中定義帶“默認參數”的函數可能略微有些繁瑣,當然了,方法可能不止一種,本文不打算從枯燥的理論層面討論這些方法,而是給出一個實例,希望能夠起到拋磚引玉的作用。
使用C++開發過程序時,定義函數可以指定默認參數,例如 void fun(int x, int y=3); 在調用 fun() 時第二個參數可以不傳遞,此時 fun() 函數默認第二個參數等於 3,例如 f(1) 就相當於 f(1,3)。這是一個很好用的特性,那麼在C語言程序開發中,是否也可以定義帶“默認參數”的函數呢?
有“默認參數”的C語言函數
首先應該清楚,目前C語言還沒有原生支持帶默認參數的函數,也就是說下面這樣的C語言代碼是非法的:
void fun(int x, int y =3)
{
return x+y;
}
fun(1); // 不等價於 fun(1, 3)
但是,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.14
f(1); // 輸出 i=1, x=3.14
f(2, 6.28); // 輸出 i=2,x=6.28
使用C++開發過程序時,定義函數可以指定默認參數,例如 void fun(int x, int y=3); 在調用 fun() 時第二個參數可以不傳遞,此時 fun() 函數默認第二個參數等於 3,例如 f(1) 就相當於 f(1,3)。這是一個很好用的特性,那麼在C語言程序開發中,是否也可以定義帶“默認參數”的函數呢?
有“默認參數”的C語言函數
首先應該清楚,目前C語言還沒有原生支持帶默認參數的函數,也就是說下面這樣的C語言代碼是非法的:
void fun(int x, int y =3)
{
return x+y;
}
fun(1); // 不等價於 fun(1, 3)
但是,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.14
f(1); // 輸出 i=1, x=3.14
f(2, 6.28); // 輸出 i=2,x=6.28
C語言自然沒有支持這種需求的原生語法,但是為了實現這樣的目的,可以定義下面這個結構體,請看相關C語言代碼:
typedef struct {
int i;
double x;
} f_args;
接著,定義 f_base() 函數,它的C語言代碼實現和 f() 是一樣的,目的是讓 f_base() 函數具有期望的 f() 函數功能。然後再定義一個函數將 f_base() 封裝,相關C語言代碼如下,請看:
double var_f(f_args in)
{
int i_out = in.i ? in.i : 8;
double x_out = in.x ? in.x : 3.14;
return f_base(i_out, x_out);
}
使用C++開發過程序時,定義函數可以指定默認參數,例如 void fun(int x, int y=3); 在調用 fun() 時第二個參數可以不傳遞,此時 fun() 函數默認第二個參數等於 3,例如 f(1) 就相當於 f(1,3)。這是一個很好用的特性,那麼在C語言程序開發中,是否也可以定義帶“默認參數”的函數呢?
有“默認參數”的C語言函數
首先應該清楚,目前C語言還沒有原生支持帶默認參數的函數,也就是說下面這樣的C語言代碼是非法的:
void fun(int x, int y =3)
{
return x+y;
}
fun(1); // 不等價於 fun(1, 3)
但是,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.14
f(1); // 輸出 i=1, x=3.14
f(2, 6.28); // 輸出 i=2,x=6.28
C語言自然沒有支持這種需求的原生語法,但是為了實現這樣的目的,可以定義下面這個結構體,請看相關C語言代碼:
typedef struct {
int i;
double x;
} f_args;
接著,定義 f_base() 函數,它的C語言代碼實現和 f() 是一樣的,目的是讓 f_base() 函數具有期望的 f() 函數功能。然後再定義一個函數將 f_base() 封裝,相關C語言代碼如下,請看:
double var_f(f_args in)
{
int i_out = in.i ? in.i : 8;
double x_out = in.x ? in.x : 3.14;
return f_base(i_out, x_out);
}
顯然,從上述C語言代碼來看,var_f() 函數實現了默認參數的功能。現在再定義一個帶可變參數的宏,這樣一來,調用者就不必知道結構體 f_args 的結構了:
#define f(...) var_f((f_args){__VA_ARGS__})
現在我們就在C語言中實現了帶“默認參數”的方法,全部C語言代碼如下,請看:
使用C++開發過程序時,定義函數可以指定默認參數,例如 void fun(int x, int y=3); 在調用 fun() 時第二個參數可以不傳遞,此時 fun() 函數默認第二個參數等於 3,例如 f(1) 就相當於 f(1,3)。這是一個很好用的特性,那麼在C語言程序開發中,是否也可以定義帶“默認參數”的函數呢?
有“默認參數”的C語言函數
首先應該清楚,目前C語言還沒有原生支持帶默認參數的函數,也就是說下面這樣的C語言代碼是非法的:
void fun(int x, int y =3)
{
return x+y;
}
fun(1); // 不等價於 fun(1, 3)
但是,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.14
f(1); // 輸出 i=1, x=3.14
f(2, 6.28); // 輸出 i=2,x=6.28
C語言自然沒有支持這種需求的原生語法,但是為了實現這樣的目的,可以定義下面這個結構體,請看相關C語言代碼:
typedef struct {
int i;
double x;
} f_args;
接著,定義 f_base() 函數,它的C語言代碼實現和 f() 是一樣的,目的是讓 f_base() 函數具有期望的 f() 函數功能。然後再定義一個函數將 f_base() 封裝,相關C語言代碼如下,請看:
double var_f(f_args in)
{
int i_out = in.i ? in.i : 8;
double x_out = in.x ? in.x : 3.14;
return f_base(i_out, x_out);
}
顯然,從上述C語言代碼來看,var_f() 函數實現了默認參數的功能。現在再定義一個帶可變參數的宏,這樣一來,調用者就不必知道結構體 f_args 的結構了:
#define f(...) var_f((f_args){__VA_ARGS__})
現在我們就在C語言中實現了帶“默認參數”的方法,全部C語言代碼如下,請看:
上述C語言代碼在 main() 函數中調用 f() 函數,並分別傳遞了不同的參數,編譯並執行之,得到如下結果:
# gcc t.c
# ./a.out
i=3, x=8.00
i=1, x=2.30
i=2, x=3.14
i=8, x=9.20
最後
可見,C語言是一門極其簡潔靈活的編程語言,其他編程語言中一些好用的特性,可能C語言沒有原生語法支持,但是我們卻可以組合其他基本語法,自己實現這些好用的特性。
不過應該注意,有件事是行不通的——f(0),因為上述實現我們無法在 var_f() 中區分 “0”究竟是調用者傳遞的,還是默認值,不過我相信聰明的讀者應該能夠想到解決這樣的問題的方法。
使用C++開發過程序時,定義函數可以指定默認參數,例如 void fun(int x, int y=3); 在調用 fun() 時第二個參數可以不傳遞,此時 fun() 函數默認第二個參數等於 3,例如 f(1) 就相當於 f(1,3)。這是一個很好用的特性,那麼在C語言程序開發中,是否也可以定義帶“默認參數”的函數呢?
有“默認參數”的C語言函數
首先應該清楚,目前C語言還沒有原生支持帶默認參數的函數,也就是說下面這樣的C語言代碼是非法的:
void fun(int x, int y =3)
{
return x+y;
}
fun(1); // 不等價於 fun(1, 3)
但是,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.14
f(1); // 輸出 i=1, x=3.14
f(2, 6.28); // 輸出 i=2,x=6.28
C語言自然沒有支持這種需求的原生語法,但是為了實現這樣的目的,可以定義下面這個結構體,請看相關C語言代碼:
typedef struct {
int i;
double x;
} f_args;
接著,定義 f_base() 函數,它的C語言代碼實現和 f() 是一樣的,目的是讓 f_base() 函數具有期望的 f() 函數功能。然後再定義一個函數將 f_base() 封裝,相關C語言代碼如下,請看:
double var_f(f_args in)
{
int i_out = in.i ? in.i : 8;
double x_out = in.x ? in.x : 3.14;
return f_base(i_out, x_out);
}
顯然,從上述C語言代碼來看,var_f() 函數實現了默認參數的功能。現在再定義一個帶可變參數的宏,這樣一來,調用者就不必知道結構體 f_args 的結構了:
#define f(...) var_f((f_args){__VA_ARGS__})
現在我們就在C語言中實現了帶“默認參數”的方法,全部C語言代碼如下,請看:
上述C語言代碼在 main() 函數中調用 f() 函數,並分別傳遞了不同的參數,編譯並執行之,得到如下結果:
# gcc t.c
# ./a.out
i=3, x=8.00
i=1, x=2.30
i=2, x=3.14
i=8, x=9.20
最後
可見,C語言是一門極其簡潔靈活的編程語言,其他編程語言中一些好用的特性,可能C語言沒有原生語法支持,但是我們卻可以組合其他基本語法,自己實現這些好用的特性。
不過應該注意,有件事是行不通的——f(0),因為上述實現我們無法在 var_f() 中區分 “0”究竟是調用者傳遞的,還是默認值,不過我相信聰明的讀者應該能夠想到解決這樣的問題的方法。
歡迎在評論區一起討論,質疑。文章都是手打原創,每天最淺顯的介紹C語言、linux等嵌入式開發,喜歡我的文章就關注一波吧,可以看到最新更新和之前的文章哦。
未經許可,禁止轉載。