2016-05-18 110 views
1

有沒有辦法將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])(); 
... 
+5

問題出在哪裏?你的代碼看起來或多或少。 –

+0

用參數*聲明函數指針類型*。創建這個函數指針類型的數組。迭代數組並傳遞特定於迭代的參數(例如,帶有數字的字符串)。利潤。順便說一句,爲什麼不只是使用不同參數的* single *函數呢? –

+0

@MichaelWalz - 這是沒有問題的,我很好奇,如果由於某種原因,我有一個100層的功能一樣,如果當時我能夠使用一個循環來初始化我的菜單排列,而不是手工編寫各功能命名 –

回答

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; 
} 
相關問題