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這裡需...