Forwärts Deklaration

Hallo zusammen,

ich bekomme beim Übersetzten eines Programmes unter SuSE 10.1 mit der GCC
Version gcc (GCC) 4.1.0 (SUSE Linux) immer den Fehler

Code:
apihandler.h:116: error: redefinition of typedef ‘api_handler_t’
apihandler.h:45: error: previous declaration of ‘api_handler_t’ was here

und hier einmal ein paar Zeilen aus der Headerdatei
Code:
...
typedef struct api_handler api_handler_t;

/// Ladend des zu verwendenen IFD-Handlers.
typedef short (*load_ifdh_t)( api_handler_t *p_apih, const char* p_ifdhname );

/// Initialisieren des API-Handlers
typedef short (*apih_init_t)( api_handler_t *p_apih, char *p_ctname, char *p_ctport, int p_channel );
...
typedef struct api_handler
{
   // API-Handler Funktionen
   //--------------------------------------------------------
   load_ifdh_t      load_ifdh;        /// Ladend des zu verwendenen IFD-Handlers.
   apih_init_t      apih_init;        /// Initialisieren des API-Handlers
   ct_open_t        ct_open;          /// Verbindung zu einem Kartenterminal herstellen.
   ct_close_t       ct_close;         /// Verbindung zu einem Kartenterminal trennen.
   ct_reset_t       ct_reset;         /// Kartenterminal reseten.
   icc_reset_t      icc_reset;        /// Chipkarte reseten.
   icc_request_t    icc_request;      /// Chipkarte anfordern.
   icc_read_t       icc_read;         /// Lesen von einer Chipkarte.
   icc_write_t      icc_write;        /// Schreiben auf eine Chipkarte.
   icc_verifypin_t  icc_verifypin;    /// PIN verifizieren.
   icc_changepin_t  icc_changepin;    /// PIN aendern.


   // Pointer auf Bibliotheksresourcen.
   //--------------------------------------------------------
#ifdef WIN32
   HINSTANCE apih_lib;
   HINSTANCE ifdh_lib;
#else

#endif

   // Offizielle Kartenterminalschnittstelle ( CT_API, PC/SC )
   //--------------------------------------------------------
   void *ifd_handler;

} api_handler_t;

Ich benötige also die Forwärtsdeklartaion um api_handler_t als Parameter in den
typedefs für die Funktionspointern zu benutzen, wobei die Funktionspointer selbst auch in der Struktur api_handler_t verwendet werden.

Unter WindowsXP mit Visual Studio 2005 gibt es keine Fehler !
 
Hi.

Man darf in C ein typedef nicht redefinieren. (wie der Compiler bereits sagte).

In C++ ist es allerdings erlaubt (wenn der redefinierte Typ gleich dem ursprünglichen ist). Ich vermute mal du hast deinen Code unter Window mit dem C++ Compiler vom Visual Studio kompiliert?

Du brauchst doch allerdings auch das typedef nicht nochmal neu zu definieren. Es reicht völlig den Typ für den du das Synonym "api_handler_t" vereinbart hast zu definieren:
C:
typedef struct x x_t;
...
struct x { 
  ...
};
Gruß
 
Zuletzt bearbeitet:
He das ist die Lösung des Problems, so funktioniert es endlich, vielen Dank !

Habe unter Windows noch einmal die Kompilierungsart geprüft und da ist
als C-Code kompilieren eingestellt. Da sieht man mal wieder das Microsoft
manche Sachen nicht so genau nimmt :confused:
 
Zurück