'萬能的C語言,也能像其他語言那樣定義帶“默認參數”的函數嗎?'

C語言 編程語言 Linux 文章 嵌入式時代 2019-09-06
"

使用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語言函數

首先應該清楚,目前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語言函數

首先應該清楚,目前C語言還沒有原生支持帶默認參數的函數,也就是說下面這樣的C語言代碼是非法的:

void fun(int x, int y =3)
{
return x+y;
}
fun(1); // 不等價於 fun(1, 3)

但是,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.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語言函數

首先應該清楚,目前C語言還沒有原生支持帶默認參數的函數,也就是說下面這樣的C語言代碼是非法的:

void fun(int x, int y =3)
{
return x+y;
}
fun(1); // 不等價於 fun(1, 3)

但是,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.14
f(1); // 輸出 i=1, x=3.14
f(2, 6.28); // 輸出 i=2,x=6.28
萬能的C語言,也能像其他語言那樣定義帶“默認參數”的函數嗎?

C語言沒有定義“默認參數”函數的原生語法

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語言函數

首先應該清楚,目前C語言還沒有原生支持帶默認參數的函數,也就是說下面這樣的C語言代碼是非法的:

void fun(int x, int y =3)
{
return x+y;
}
fun(1); // 不等價於 fun(1, 3)

但是,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.14
f(1); // 輸出 i=1, x=3.14
f(2, 6.28); // 輸出 i=2,x=6.28
萬能的C語言,也能像其他語言那樣定義帶“默認參數”的函數嗎?

C語言沒有定義“默認參數”函數的原生語法

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語言,也能像其他語言那樣定義帶“默認參數”的函數嗎?

將 f_base() 封裝

顯然,從上述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語言函數

首先應該清楚,目前C語言還沒有原生支持帶默認參數的函數,也就是說下面這樣的C語言代碼是非法的:

void fun(int x, int y =3)
{
return x+y;
}
fun(1); // 不等價於 fun(1, 3)

但是,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.14
f(1); // 輸出 i=1, x=3.14
f(2, 6.28); // 輸出 i=2,x=6.28
萬能的C語言,也能像其他語言那樣定義帶“默認參數”的函數嗎?

C語言沒有定義“默認參數”函數的原生語法

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語言,也能像其他語言那樣定義帶“默認參數”的函數嗎?

將 f_base() 封裝

顯然,從上述C語言代碼來看,var_f() 函數實現了默認參數的功能。現在再定義一個帶可變參數的宏,這樣一來,調用者就不必知道結構體 f_args 的結構了:

#define f(...) var_f((f_args){__VA_ARGS__})

現在我們就在C語言中實現了帶“默認參數”的方法,全部C語言代碼如下,請看:

萬能的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語言函數

首先應該清楚,目前C語言還沒有原生支持帶默認參數的函數,也就是說下面這樣的C語言代碼是非法的:

void fun(int x, int y =3)
{
return x+y;
}
fun(1); // 不等價於 fun(1, 3)

但是,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.14
f(1); // 輸出 i=1, x=3.14
f(2, 6.28); // 輸出 i=2,x=6.28
萬能的C語言,也能像其他語言那樣定義帶“默認參數”的函數嗎?

C語言沒有定義“默認參數”函數的原生語法

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語言,也能像其他語言那樣定義帶“默認參數”的函數嗎?

將 f_base() 封裝

顯然,從上述C語言代碼來看,var_f() 函數實現了默認參數的功能。現在再定義一個帶可變參數的宏,這樣一來,調用者就不必知道結構體 f_args 的結構了:

#define f(...) var_f((f_args){__VA_ARGS__})

現在我們就在C語言中實現了帶“默認參數”的方法,全部C語言代碼如下,請看:

萬能的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語言,也能像其他語言那樣定義帶“默認參數”的函數嗎?

點個贊再走吧

歡迎在評論區一起討論,質疑。文章都是手打原創,每天最淺顯的介紹C語言、linux等嵌入式開發,喜歡我的文章就關注一波吧,可以看到最新更新和之前的文章哦。

未經許可,禁止轉載。

"

相關推薦

推薦中...