2012-01-16 8 views
5

estoy creando una DLL utilizando Visual C++ Express, y cuando se declara extern ValveInterfaces* VIFace dentro Required.h, el compilador me dice que ValveInterfaces no está definido. (Quiero exponer VIFace a cualquier archivo que incluye Required.h)palabra clave extern "especificador de tipo que falta"

Aquí está la estructura de mis archivos:

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 

Captura de pantalla de errores: http://i.imgur.com/lZBuB.png

+0

No debe usar nombres reservados para incluir guardias. Aunque no es la causa de su problema en particular (que se debe a la inclusión circular de 'ValveInterfaces.h' y' Required.h'), puede causar [problemas similares] (http://stackoverflow.com/questions/3345159/ in-c-whats-so-special-about-move-h). –

Respuesta

4

Ese primer error:

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

es un claro indicativo de que el tipo tiene ValveInterfacesno sido definido d en el punto donde primero intentas usarlo.

Esto ocurre casi invariablemente porque se desconoce el tipo de ValveInterfaces. Es un poco difícil de entender ya que ha cortado enormes franjas de ValveInterfaces.h pero, incluso si se define allí, podría ser una combinación extraña de #pragma once y la aparente extravío de la _REQUIRED_H incluyen guardias (que normalmente estarían en required.h) que te está causando dolor

+0

Eh, eso es lo que pensé, pero ¿por qué no? Incluí el archivo de encabezado antes de declararlo como un extern. –

+3

He pegado toda ValveInterfaces.h dentro. Creo que mi problema es que ValveInterfaces.h incluye Required.h, que también incluye ValveInterfaces.h. –

+0

Puede tener razón. Soltaría el 'pragma una vez 'por completo y usaría los guardias de inclusión más portátiles. Y deshacerse de referencias circulares también. – paxdiablo

1

Estás usando ValveInterface (singular) pero declarando ValveInterfaces (plural).

+0

Lo sentimos, lo escribimos mal ... Debe ser ValveInterfaces, lo editó. Intellisense no detecta el error (?) –

3

Tenga en cuenta que la inclusión circular, como la forma en que tiene Required.h y ValveInterfaces.h, suele ser un olor a código. Si divide la referencia circular, es menos probable que surjan problemas como estos.

Lo que puede intentar hacer es reenviar todo lo que pueda en ValveInterfaces.h y mantenerlo autónomo. No parece que ValveInterfaces necesite todo lo de Requires.h, así que no lo incluyas.

#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 
Cuestiones relacionadas