Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何初始化带有循环的函数指针数组_C_Function Pointers - Fatal编程技术网

C 如何初始化带有循环的函数指针数组

C 如何初始化带有循环的函数指针数组,c,function-pointers,C,Function Pointers,有没有办法获取func1到func4的所有地址,以便我可以在for循环中使用它们来初始化菜单?我有一种感觉,通过某种宏观手段,这是可能的。我在谷歌上搜索过,但没有找到任何帮助 ... void func1(void) { printf("func1\n"); } void func2(void) { printf("func2\n"); } void func3(void) { printf("func3\n"); } void func4(void) { printf("func4\n");

有没有办法获取func1到func4的所有地址,以便我可以在for循环中使用它们来初始化菜单?我有一种感觉,通过某种宏观手段,这是可能的。我在谷歌上搜索过,但没有找到任何帮助

...
void func1(void) { printf("func1\n"); }
void func2(void) { printf("func2\n"); }
void func3(void) { printf("func3\n"); }
void func4(void) { printf("func4\n"); }

int main(int argc, char** argv)
    {
    int num=0;
    printf("Scanf: 0 - 4\n");
    scanf(" %d", &num);

    void (*menu[])(void) = {func1,
                            func2,
                            func3,
                            func4};

    if(num <= 4) (*menu[num-1])();
...
。。。
void func1(void){printf(“func1\n”);}
void func2(void){printf(“func2\n”);}
void func3(void){printf(“func3\n”);}
void func4(void){printf(“func4\n”);}
int main(int argc,字符**argv)
{
int num=0;
printf(“Scanf:0-4\n”);
scanf(“%d”和&num);
void(*菜单[])(void)={func1,
职能2,
职能3,
func4};
if(num
有没有办法获得func1到func4的所有地址

不,这些函数的地址可以在非连续区域中

我有一种感觉,这可能是某种宏观的 诡计

您是否正在寻找一种立即声明和分配的方法

在这种情况下:

#define PROTO(name) static void func##name(void) { printf("func"#name"\n"); }
#define EVENT(name) func##name,

#define EVENTS(EXEC) \
    EXEC(1) \
    EXEC(2) \
    EXEC(3) \
    EXEC(4)

EVENTS(PROTO)

int main(void)
{
    void (*menu[])(void) = {EVENTS(EVENT)};

    return 0;
}
输出:

static void func1(void) { printf("func""1""\n"); }
static void func2(void) { printf("func""2""\n"); }
static void func3(void) { printf("func""3""\n"); }
static void func4(void) { printf("func""4""\n"); }

int main(void)
{
    void (*menu[])(void) = {func1, func2, func3, func4,};

    return 0;
}

问题出在哪里?您的代码看起来或多或少很好。使用参数声明函数指针类型。生成此函数指针类型的数组。迭代数组并传递迭代特定的参数(例如,带数字的字符串).Profit.BTW,为什么不使用一个具有不同参数的函数?@MichaelWalz-没有问题,我很好奇,出于某种原因,我是否有100个这样的函数,如果我能够使用循环初始化我的菜单数组,而不是手动编写每个函数name@ShadyProgrammer好的,现在我明白了。答案是否定的。如果你有100个不同的函数,将它们全部放在一个数组中不是什么大问题。顺便问一下,您如何确定菜单中函数的顺序以及放在那里的函数号?下面的答案可能是您想要的,但只有当函数名如
funcX
,其中X从1变为N,并且您仍然需要执行一个时,这才有效bug#define包含所有
EXEC(x)
@EugeneSh。我无法理解你的建议,你能发布一个答案来演示吗?