2013-03-25 9 views
5

Ich bin auf ein eigenartiges Problem gestoßen. Es ist vielleicht am besten, Ihnen nur zu zeigen, was ich versuche, und es dann zu erklären.Vorwärtsdeklaration des Funktionszeigers typedef

typedef void functionPointerType (struct_A * sA); 

typedef struct 
{ 
    functionPointerType ** functionPointerTable; 
}struct_A; 

Grundsätzlich habe ich eine Struktur struct_A mit einem Zeiger auf eine Tabelle von Funktionszeigern, die struct_A einen Parameter des Typs haben. Aber ich bin mir nicht sicher, wie ich das kompilieren soll, da ich mir nicht sicher bin, wie oder ob das forward deklarieren kann.

Wer weiß, wie das erreicht werden könnte?

bearbeiten: minor fix in Code

Antwort

9

nach vorne erklären, wie Sie vorschlagen:

/* Forward declare struct A. */ 
struct A; 

/* Typedef for function pointer. */ 
typedef void (*func_t)(struct A*); 

/* Fully define struct A. */ 
struct A 
{ 
    func_t functionPointerTable[10]; 
}; 

Zum Beispiel:

#include <stdio.h> 
#include <string.h> 
#include <stdlib.h> 

struct A; 

typedef void (*func_t)(struct A*); 

struct A 
{ 
    func_t functionPointerTable[10]; 
    int value; 
}; 

void print_stdout(struct A* a) 
{ 
    printf("stdout: %d\n", a->value); 
} 

void print_stderr(struct A* a) 
{ 
    fprintf(stderr, "stderr: %d\n", a->value); 
} 

int main() 
{ 
    struct A myA = { {print_stdout, print_stderr}, 4 }; 

    myA.functionPointerTable[0](&myA); 
    myA.functionPointerTable[1](&myA); 
    return 0; 
} 

Ausgang:

 
stdout: 4 
stderr: 4 

Online-Demo ansehen http://ideone.com/PX880w.


Wie andere bereits erwähnt haben es möglich ist, hinzuzufügen:

typedef struct A struct_A; 

vor der Funktionszeiger typedef und vollständige Definition von struct A wenn es vorzuziehen ist, die struct Schlüsselwort wegzulassen.

+0

die Syntax für diese warf mich immer aus. – Claudiu

+0

"Wie andere bereits erwähnt haben" In der Tat. Sie können es auch einfach in Ihre Antwort einfügen und dann kann ich meine löschen. Ich denke, es würde deine Antwort besser machen und es ist die, die an die Spitze kam. –

+0

@DavidHeffernan, danke. Das Beispiel ist erfunden und die Nützlichkeit des zusätzlichen 'typedef' wird nicht wirklich vermittelt (' struct A' oder 'struct_A'). – hmjd

1

Ich denke, das ist das, was Sie suchen:

//forward declaration of the struct 
struct _struct_A;        

//typedef so that we can refer to the struct without the struct keyword 
typedef struct _struct_A struct_A;    

//which we do immediately to typedef the function pointer 
typedef void functionPointerType(struct_A *sA); 

//and now we can fully define the struct  
struct _struct_A       
{ 
    functionPointerType ** functionPointerTable; 
}; 
0

Es gibt eine andere Art und Weise, es zu tun:

typedef struct struct_A_ 
{ 
    void (** functionPointerTable) (struct struct_A_); 
}struct_A; 


void typedef functionPointerType (struct_A); 
Verwandte Themen