如何使用循环初始化指向函数的指针数组

时间:2016-05-18 14:13:15

标签: c function-pointers

有没有办法获取func1到func4的所有地址,以便我可以在for循环中使用它们来初始化我的菜单?我有一种感觉,这可能是某种宏观诡计。我已经浏览了谷歌和SO,但我没有找到任何帮助。

...
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])();
...

1 个答案:

答案 0 :(得分:2)

  

有没有办法获取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;
}