c語言怎樣設定乙個函式,可以接受任何型別的引數並返回int型?

時間 2021-05-06 21:20:24

1樓:Tenma

單型別單變數

單型別雙變數

單型別N變數

雙型別N變數

N確定型別N變數

N非確定型別N變數

喪心病狂型別意淫法

單型別單變數

extern

void

func

(inta);

單型別雙變數

extern

void

func

(inta,

intb

);單型別N變數

extern

void

func

(int

array

);extern

void

func

(int

*array

);/* 等價 */

雙型別N變數

extern

void

func

(int

*array

,char

*str

);N確定型別N變數

/* N的數量是確定的情況下,且型別是確定的情況下 */extern

void

func

(int

*array

,char

*str

,short

*sNum

,long

*lNum

,long

long

*llNum

);N非確定型別N變數

/* 型別不確定的情況下,但N的數量確定 */extern

void

func

(void*a

,void*b

,void*c

,void*d

);/* N的數量不確定,且型別不確定 */intprintf

(const

char

*format

,...

);/* 參照printf */

/* 結構體方法 */

/* 函式原型

* para用於傳參

* resData用於返回

*/extern

void

func

(const

void

*para

,void

*const

resData

);/* 函式func()的引數結構體 */struct

_func_para

;/* 函式func()的返回值結構體 */struct

_func_res

;/* define只是示意 */

#define MYTYPE_para struct _func_para

#define MYTYPE_res struct _func_res

/* 函式體 */

void

func

(const

void

*para

,void

*const

resData

)使用案例:

/* 使用 */

void

myToString

(struct

_func_para

*this

)int

main

(void

);MYTYPE_res

resData=;

printf

("before run\n"

);para

.toString(&

para

);printf

("run\n"

);func(&

para,&

resData

);printf

("after run\n"

);para

.toString(&

para

);printf

("isRun:%d\n"

,resData

.isRun

);return0;

}喪心病狂型別意淫法

/* 函式原型 */

extern

void

func

(void**p

);食用方法:

/* func原型的函式體 */

void

func

(void**p

);showFunc(q

);}/* 輔助函式,單純演示一下,哪怕函式也能傳過去 */void

showMe

(void**q

)int

main

(void

);/* 更極致的寫法 */

//void* p = ;

func(p

);/* run */

return0;}

2樓:

大概就是

intfoo_

(void

*placeholder

,...)

placeholder是指明後面引數位置的,和va_list系列巨集配套使用。

可以用支援變長巨集的編譯器,把這個foo_的引數部分封裝一下,讓它在開始的時候自動插入乙個NULL。

3樓:張治靈

傳入指標啊,我們寫微控制器一般是這麼用的。

int a(u8 *target){

int rt;

//todo

return rt;

用的時候

int i = a((u8 *)ch);

4樓:暮無井見鈴

C 的話可能不行。

首先舊式函式宣告(如 int foo(); )並不是解。

需要明確的是舊式宣告只是阻止編譯器檢查引數型別和數量,但假如傳入的引數不符合函式定義中的要求,則導致未定義行為。

而且舊式的宣告/定義已經在新的 C2x 標準草案中被移除了。 C2x 開始 int foo(); 就等價於 int foo(void); 。

其次,變長引數在 C 中很接近要求,但按照標準,不能所有引數都是變長引數。參考

Variadic arguments

最接近的做法就是類似 scanf/printf 那樣,宣告為 int foo(SomeType arg, ...); 。

如是 C++ 的話就比較簡單。

C++ 允許 int foo(...); (雖然無法訪問引數)。

而且 C++11 開始可以寫函式模板

template int foo(Args&&... args);

C++20 中有縮寫形式 int foo(auto&&... args); (與前面的形式等價)。

5樓:wmgx

void 型別,按需求強轉

類似這種

#include

intfunc

(void*i

)int

main()

C 函式怎麼實現同乙個形參位置可以接受不同型別的實參?

王賽 這也算是多型,有多種手法可以達到這個目的。預處理期用函式巨集。編譯期用過載或模板。執行期的用型別擦除,可以用 variant 或 union 擦除限定範圍型別,callback 風格使用 void std function 或是 virtual 介面的類型別。 d41d8c 正常寫就行。比如 ...

x86上為什麼C語言呼叫乙個函式要先把引數壓棧,之後才是返回位址?

Thomson 把壓棧和跳轉分開,讓編譯器甚至程式設計師計算返回位址,即使可以,效能和安全性也是很大的問題。除了把返回位址放在函式棧幀的頂部,也可以給函式的引數區域大小預留本函式或者裡面可能的tail call中最大值,就不用擔心引數放不下了。tail call對x86和命令式語言幫助不大吧,反正有...

c語言的乙個疑問?

最佳答案就在C語言的標準裡,C99標準裡定義了6種statement 語句 for語句屬於 iteration statementif語句屬於 selection statement所謂花括號 屬於compound statement而帶分號 的語句屬於expression statement這裡需...