2015-07-10 6 views
5

Ich habe folgende konstante Struktur, die Funktionszeiger hält:Wie mache ich Funktionszeiger in einer Strukturkonstante, um ein konstantes Array zu initialisieren?

/* 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 
} 

So weit, so gut!

Jetzt möchte ich eine konstante Anordnung der obigen Struktur schaffen und die Funktionszeiger von Instanzen der Struktur zuweisen:

/* module2.c */ 

#include <module1.h> 

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

Compiler einen Fehler wirft und sagt, dass die Ausdrücke "myStruct1.funcPtr1" und "myStruct1.funcPtr2" nicht konstant waren .
Was ist los?

+0

Sind Sie sicher ist enthalten. Zum Einbinden der lokalen Datei '#include" module1.h "'. – Jeyaram

+0

Es ist sicherlich enthalten. – momjovi89

+0

Dies ist kein Problem im Zusammenhang mit Funktionszeigern, sondern ein Problem im Zusammenhang mit der Initialisierung von Variablen im Allgemeinen. – alk

Antwort

2

myStruct1 ist mit dem Qualifier const deklariert, aber es ist nicht konstant. Statische Initialisierung erfordert es, und arrayOfMyStruct hat statische Speicherdauer.

alle Ausdrücke in einem Initialisierer für ein Objekt, das statische oder Fadenspeicherdauer hat, darf konstante Ausdrücke oder Stringliterale sein.

Sie können es initialisieren, indem Sie die Funktionen direkt über: { func1, func2 },

oder nehmen Sie die Adresse des Zeigers: { &myStruct1.funcPtr1, &myStruct1.funcPtr2 },

in diesem Fall müssen Sie eine andere Strukturtyp für das Array verwenden:

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

und Syntax für die Funktion aufrufen muss geändert werden:

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

Die erste Lösung ist in meiner Anwendung nicht möglich. In der Tat ist der Typ des Arrays in module2.c ein anderer Typ, aber es enthält die gleichen Funktions-Zeigertypen, also habe ich dasselbe benutzt, um das Problem zu erklären. Mit der zweiten Lösung meinen Sie, dass ich die Struktur für module2.c so ändern muss, dass sie einen "Zeiger auf einen Funktionszeiger" handhabt, oder? Aber das will ich eigentlich nicht ändern. Gibt es keine Möglichkeit, die "myStruct1.funcPtr1" konstant zu machen? – momjovi89

+1

@ momjovi89 Abgesehen von den oben aufgeführten Möglichkeiten. Nein. – this