2017-02-25 2 views
4

Ich versuche, eine Struktur mit dem Namen „IExampleVtbl“ erstellen die einen Zeiger auf meine Funktionen (SetStringPtr, GetStringPtr) und wird ein Teil einer anderen Struktur „IExample“ halten wird.Wie bestellt man C-Struktur/Funktionsdeklarationen, die sich gegenseitig benutzen?

Aber ich will die andere Struktur passieren "IExample" als Parameter zu den Funktionen (SetStringPtr, GetStringPtr).

Dies ist der Code:

#include <windows.h> 
#include <stdio.h> 

typedef struct { 
    SetStringPtr *SetString; 
    GetStringPtr *GetString; 
} IExampleVtbl; 

typedef struct { 
    IExampleVtbl *lpVtbl; 
    DWORD count; 
    char buffer[80]; 
} IExample; 

typedef long SetStringPtr(IExample *, char *); 
typedef long GetStringPtr(IExample *, char *, long); 

long SetString(IExample *this, char * str) 
{ 
    ... 

    return(0); 
} 

long GetString(IExample *this, char *buffer, long length) 
{ 
    ... 

    return(0); 
} 

Wie Sie die erste Struktur über die Funktionen wissen müssen sehen können, die Funktionen über die zweite Struktur wissen müssen, die über die erste Struktur wissen müssen.

Wie kann ich das lösen?

Antwort

4

Sie die Probleme

  • typedefs für die Strukturen
  • lösen können, indem sie die Dinge in der folgenden Reihenfolge typedefs für die Funktionszeiger
  • Strukturdefinitionen
  • Funktionsdefinitionen

Um diese Arbeit zu machen, müssen Sie die Strukturen mit Tags definieren:

typedef struct IExampleVtblTag IExampleVtbl; 
typedef struct IExampleTag IExample; 
typedef long SetStringPtr(IExample *, char *); 
typedef long GetStringPtr(IExample *, char *, long); 

struct IExampleVtblTag { 
    SetStringPtr *SetString; 
    GetStringPtr *GetString; 
}; 

struct IExampleTag { 
    IExampleVtbl *lpVtbl; 
    DWORD count; 
    char buffer[80]; 
}; 

long SetString(IExample *this, char * str) 
{ 
    return(0); 
} 

long GetString(IExample *this, char *buffer, long length) 
{ 
    return(0); 
} 
+0

Dank es funktioniert wie ein Charme! –

1

Sie kombinieren eine forward-Deklaration mit dem Typ-Alias-Definition:

// Forward declaration of the structure IExample 
// And at the same time definition of the type-alias IExample 
typedef struct IExample IExample; 

typedef long SetStringPtr(IExample *, char *); 
typedef long GetStringPtr(IExample *, char *, long); 

// Now the definition of the structures 
typedef struct { ... } IExampleVtbl; 

// Because the previous type-alias definition, we need to specify a structure tag 
struct IExample { ... }; 
0

typedef für die Struktur, typedef'd werden kann die Definition der Struktur vorangestellt, so ein bisschen Neuanordnung sollte die Dinge hier funktionieren lassen

typedef struct IExample IExample; 

typedef long SetStringPtr(IExample *, char *); 
typedef long GetStringPtr(IExample *, char *, long); 

typedef struct { 
    SetStringPtr *SetString; 
    GetStringPtr *GetString; 
} IExampleVtbl; 

struct IExample { 
    IExampleVtbl *lpVtbl; 
    long count; 
    char buffer[80]; 
}; 
+0

Symbole mit einem führenden Unterstrich gefolgt von einem Großbuchstaben sind in allen Bereichen der "Implementierung" (Compiler und Standardbibliothek) vorbehalten. Und da Struktur-Tags in einem separaten Namespace leben, können sie denselben Namen wie andere Symbole haben (wie der Typ-Alias), so dass der Unterstrich nicht benötigt wird. –

+0

[Welche Regeln gelten für die Verwendung eines Unterstrichs in einer C++ - ID?] (Http://stackoverflow.com/questions/228783/what-are-the-rules-about-using-an-underscore-in-ac-identifier)) –

+0

Ja, das stimmt, habe die Antwort bearbeitet –

Verwandte Themen