簡體   English   中英

C 中內置 arguments 的函數數組

[英]Array of functions with built in arguments in C

假設我有這兩個函數和這兩個函數的數組的定義:

int flag;

int add(int a, int b){
    return a+b;
}

int multiply(int a, int b){
    return a*b;
}

typedef int(*f)(int, int);
f func_array[2] = {&add, &multiply};

現在,我的代碼中有一個特定位置,我想根據我的標志 state 調用這兩個函數,每次都使用相同的 arguments

例如:

int var;
if(flag == 0)
{
    var = func_array[flag](1,1); 
}
else{
    var = func_array[flag](2,2); 
}

有沒有辦法在數組本身內部定義它? Somwhow 像這樣定義數組並調用 function:

f func_array[2] = {&add(1,1), &multiply(2,2)};
int var = func_array[flag]();

這是一種有效的方式嗎? 有沒有更優雅的方法來做到這一點?

您可以為每個參數定義一組 arrays:

#define ARR_SIZE 2
typedef int(*f)(int, int);

f func_array[ARR_SIZE]     = {&add, &multiply};
int param1_array[ARR_SIZE] = { 1, 2};
int param2_array[ARR_SIZE] = { 1, 2};

電話會變成

if(flag < ARR_SIZE)
{
    int var = func_array[flag](param1_array[flag], param2_array[flag]);
}

我剛剛添加了對數組大小的檢查。


用宏

#define flag_call(flag) \
   func_array[flag](param1_array[flag], param2_array[flag])

你可以更簡化它

if(flag < ARR_SIZE)
{
    flag_call(flag);
}

不知道重點是什么,但你可以這樣做:

int add11(void){ return add(1,1); }
int multiply22(void){ return multiply(2,2); }
/*skipped the new typedef*/
int (*func_array2[2])(void) = {&add11,&multiply22};

https://godbolt.org/z/ejMn4n

如果您制作數組staticauto ,包裝器甚至可以是內聯的。

您可以使用結構將它們捆綁在一起:

typedef int(*f)(int, int);

struct func_and_args {
    f func;
    int a;
    int b;
}

...

struct func_and_args arr[] = {{&add,1,1},{&multiply,2,2}};

int var = arr[flag].func(arr[flag].a,arr[flag].b);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM