2012-01-16 19 views
5

Sto creando una DLL utilizzando Visual C++ Express e quando si dichiara extern ValveInterfaces* VIFace all'interno Required.h, il compilatore mi sta dicendo che ValveInterfaces non è definito. (Voglio esporre VIFace a qualsiasi file incluso Required.h)extern parola chiave "indicatore di tipo mancante"

Ecco la struttura dei miei file:

DLLMain.cpp

#include "Required.h" //required header files, such as Windows.h and the SDK 

ValveInterfaces* VIFace; 

//the rest of the file 

Required.h

#pragma once 
//include Windows.h, and the SDK 
#include "ValveInterfaces.h" 

extern ValveInterfaces* VIFace; //this line errors 

ValveInterfaces.h

#pragma once 
#ifndef _VALVEINTERFACES_H_ 
#define _VALVEINTERFACES_H_ 
#include "Required.h" 

class ValveInterfaces 
{ 
public: 
    ValveInterfaces(void); 
    ~ValveInterfaces(void); 
    static CreateInterfaceFn CaptureFactory(char *pszFactoryModule); 
    static void* CaptureInterface(CreateInterfaceFn fn, char * pszInterfaceName); 
    //globals 
    IBaseClientDLL* gClient; 
    IVEngineClient* gEngine; 
}; 
#endif 

Schermata di errori: http://i.imgur.com/lZBuB.png

+0

Non si dovrebbero usare nomi riservati per includere guardie. Sebbene non sia la causa del tuo particolare problema (dovuto all'inclusione circolare di 'ValveInterfaces.h' e' Required.h'), può causare [problemi simili] (http://stackoverflow.com/questions/3345159/ in-c-cosa-così-speciale-su-move-h). –

risposta

4

Questo primo errore:

error C2143: syntax error : missing ';' before '*' 

è un giveaway guasto che il tipo ha ValveInterfacesnon stato definito d nel punto in cui si tenta di utilizzarlo per la prima volta.

Ciò si verifica quasi invariabilmente perché il tipo di ValveInterfaces è sconosciuto. È un po 'difficile da dire dato che hai ritagliato grandi fette di ValveInterfaces.h ma, anche se è stato definito lì, potrebbe essere una strana combinazione di #pragma once e l'apparente smarrimento delle guardie di tipo _REQUIRED_H incluse (sarebbero normalmente in required.h) che ti sta causando dolore

+0

Eh, questo è quello che pensavo, ma perché non è vero? Ho incluso il file di intestazione prima di dichiararlo come extern. –

+3

Ho incollato l'intera ValveInterfaces.h all'interno. Penso che il mio problema è che ValveInterfaces.h include Required.h, che include anche ValveInterfaces.h. –

+0

Potrebbe aver ragione. Vorrei abbandonare del tutto il 'pragma una volta 'e utilizzare le protezioni più portatili. E sbarazzati anche dei riferimenti circolari. – paxdiablo

1

Si utilizza ValveInterface (singolare) ma si dichiara ValveInterfaces (plurale).

+0

Spiacente, l'ho inserito in modo errato ... Dovrebbe essere ValveInterfaces, modificato. Intellisense non rileva l'errore (?) –

3

Si noti che l'inclusione circolare, come il modo in cui si dispone di Required.h e ValveInterfaces.h, è in genere un odore di codice. Se si interrompe il riferimento circolare, è meno probabile che si presentino problemi come questi.

Quello che puoi provare è inoltrare quanto più possibile in ValveInterfaces.h e mantenerlo autonomo. Non sembra che ValveInterfaces abbia bisogno di tutto da Requires.h quindi non includerlo.

#ifndef VALVEINTERFACES_H 
#define VALVEINTERFACES_H 
// CreateInterfaceFn probably need to be fully defined 
// so just pull whatever header has that. Don't include 
// Required.h here, there's no need for it. 

class IBaseClientDLL; 
class IVEngineClient; 
class ValveInterfaces 
{ 
public: 
    ValveInterfaces(); 
    ~ValveInterfaces(); 
    static CreateInterfaceFn CaptureFactory(char *pszFactoryModule); 
    static void* CaptureInterface(CreateInterfaceFn fn, char * pszInterfaceName); 
    //globals 
    IBaseClientDLL* gClient; 
    IVEngineClient* gEngine; 
}; 

#endif 
Problemi correlati