2015-07-10 63 views
5

我有以下結構不變持有函數指針:如何使結構中的函數指針常量用於初始化常量數組?

/* module1.h */ 

typedef struct my_struct my_struct_t; 

struct my_struct 
{ 
    void (*funcPtr1)(void); 
    void (*funcPtr2)(void); 
} 

extern const my_struct_t myStruct1; 



/* module1.c */ 

#include <module1.h> 

static void func1(void) 
{ 
    // do something 
} 

static void func2(void) 
{ 
    // do something else 
} 

const my_struct_t myStruct1 = { 
    .funcPtr1 = &func1, 
    .funcPtr2 = &func2 
} 

到目前爲止好!

現在我想從該結構的情況下創建上述結構的常量數組並分配函數指針:

/* module2.c */ 

#include <module1.h> 

const my_struct_t arrayOfMyStruct[] = { 
    { myStruct1.funcPtr1, myStruct1.funcPtr2 }, 
    // ... 
} 

編譯器會引發錯誤,並表示,該表達式"myStruct1.funcPtr1""myStruct1.funcPtr2"不是常數。
有什麼不對?

+0

是否確定已包含在內。包含本地文件'#include「module1.h」'。 – Jeyaram

+0

它肯定包括在內。 – momjovi89

+0

這不是一個與函數指針有關的問題,而是一般與變量初始化有關的問題。 – alk

回答

2

myStruct1是用限定符const聲明的,但它不是常量。靜態初始化需要它,並且arrayOfMyStruct具有靜態存儲持續時間。

在初始化所有的表達式對於具有靜態或線程存儲時限 應是常量表達式或字符串文字的對象。

可以通過直接使用函數初始化:{ func1, func2 },

或取指針的地址:{ &myStruct1.funcPtr1, &myStruct1.funcPtr2 },

在這種情況下,你將不得不使用不同結構類型的數組:

typedef struct 
{ 
    void (*const *funcPtr1)(void); 
    void (*const *funcPtr2)(void); 
} my_struct2_t; 

和語法調用函數必須改變:

(*arrayOfMyStruct[0].funcPtr2)(); 
+1

第一種解決方案不適用於我的應用程序。事實上,module2.c中的數組類型是另一種類型,但它保存着相同的函數指針類型,所以我用它來解釋這個問題。 <編輯:這裏是現在被你的編輯覆蓋的部分:>通過第二個解決方案,你的意思是我必須改變module2.c的結構,以便它處理「指向函數指針的指針」,對吧?但我不想改變這一點。沒有辦法讓「myStruct1.funcPtr1」常量? – momjovi89

+1

@ momjovi89除了上面列出的方式。沒有。 – this