2016-09-18 2 views
-1
typedef void* (*_add_elem)(shm_ds_t *ds, void *key, void *value, int size); 
typedef void* (*_lookup)(shm_ds_t *ds, void *key); 
typedef void (*_dump)(shm_ds_t *ds); 
typedef int (*_compare)(void *key1, void *key2); 

typedef struct shm_ds{ 
      void *ds; 
      _add_elem shm_add_elem; 
      _lookup shm_lookup; 
      _dump dump; 
      _compare compare; 
} shm_ds_t; 

Sein Huhn und Ei Problem. Ich habe einige Callback-Fn-Zeiger definiert, die shm_ds_t Typ verwendet, aber dieser Typ ist nach Callback-Definitionen definiert. Ähnlich, wenn ich die Reihenfolge ändere, meldet es das gleiche Problem mit Callback-Definitionen, die in diesem Fall vorher definiert werden sollen. Kann jemand bitte die Lösung vorschlagen?Kann mir jemand mit dieser Vorwärtsdeklaration in C helfen?

+1

warum fügen Sie 'typedef struct shm_ds shm_ds_t' nicht hinzu? –

+1

Warum der Downvote? – alk

+0

OT: Das Suffix '_t' ist von POSIX reserviert. Um kompatibel zu POSIX zu bleiben, müssen Sie ein anderes Benennungsschema für Typen definieren. – alk

Antwort

0

Sie müssen den Typ vor den Rückrufen definieren.

typedef struct shm_ds shm_ds_t; 

vor den Rückrufe hinzufügen und später

struct shm_ds{ 
      void *ds; 
      _add_elem shm_add_elem; 
      _lookup shm_lookup; 
      _dump dump; 
      _compare compare; 
}; 

verwenden und Sie sollten gut zu gehen.

+0

in anderen Datei, ich sehe diesen Fehler: shm_ds-> shm_add_elem = shm_add_elem; wo shm_add_elem ein Zeiger 'void * shm_ll_add_elem (shm_ds_t * ds, void * key, void * Wert, int size) zu funktionieren;' Fehler: ./LinkedList/./../shm_ds.h : 21: 1: note: expected 'void * (*) (struct shm_ds *, void *, void *, int)' aber Argument ist vom Typ 'void * (*) (struct shm_ds_t *, void *, void *, int) ' –

+0

@AbhishekSagar Zeigen Sie, wie Sie sie aufrufen. –

+0

@AbhishekSagar: "*' aber Argument ist vom Typ 'void *() (struct shm_ds_t *, ... '*" wieder: 'struct shm_ds_t' ist * nicht * ein gültiger Typ. Verwenden Sie stattdessen 'shm_ds_t'. – alk

Verwandte Themen