void test(int a,int b,int c)
{
printf("%d;%d;%d\n",a,b,c);
}
void run(void(*function)(int,int,int),int[] args,int sizeArgs)
{
function(#passing args);
}
run(test,(int[]){4,6,9});
我需要一個這樣的函式run,它接受另一個函式和一組引數。該run函式必須列舉引數然后呼叫傳遞的函式。
uj5u.com熱心網友回復:
您可以將功能調整為以下內容:
typedef void func3_t (int, int, int);
...
void run (func3_t* func, int size, const int args[size])
C 中的函式指標語法難以閱讀,因此使用typedef. 在typedef這里宣告的函式型別,然后我們讓函式接受一個函式指標,這樣的功能。
我將其更改為args,const因為它們不應該被修改,這被稱為const 正確性并且是整體良好的做法。通過將 size 引數放在陣列之前,我們可以讓陣列參考該變數。(這給出了一個指向可變長度陣列 VLA 的指標。)
函式體很簡單,只需進行一些錯誤檢查,否則將其留給呼叫者以提供正確的陣列大小:
if(size==3)
{
func(args[0], args[1], args[2]);
}
這是一個完整的例子:
#include <stdio.h>
typedef void func3_t (int, int, int);
void test(int a, int b, int c)
{
printf("%d;%d;%d\n",a,b,c);
}
void run (func3_t* func, int size, const int args[size])
{
if(size==3)
{
func(args[0], args[1], args[2]);
}
}
int main (void)
{
run(test, 3, (int[]){4,6,9});
}
如果這樣的代碼有意義,那就是另一回事了……
要創建一個型別安全的完全可變引數函式......好吧,我會首先考慮更改程式設計,因為它可能沒有任何意義。您可以用一個非常邪惡的宏替換該函式,例如:
// BAD IDEA
#define run(func, ...) _Generic(&(__VA_ARGS__), \
int(*)[3]: _Generic((func), void(*)(int,int,int): (func)) ) \
(__VA_ARGS__[0], __VA_ARGS__[1], __VA_ARGS__[2])
int main (void)
{
run(test, (int[]){4,6,9});
}
這實際上是型別安全的,并且可以擴展以支持其他函式型別……但是如果您是 C 初學者,那么請忘記這個宏,因為它使用了一些相當高級的語言特性。
uj5u.com熱心網友回復:
只需傳遞陣列的名稱,就可以將陣列作為引數傳遞給函式。int a[];---> array fun(a);--->函式呼叫所以我們實際上是傳遞陣列的基地址。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/407550.html
標籤:
上一篇:C中函式的靈活性
下一篇:檢查C中字串中的任何特殊字符
