extern关键字“缺少类型说明符”

时间:2012-01-16 07:46:07

标签: c++ c extern

我正在使用Visual C ++ Express创建一个DLL,并在声明时 extern ValveInterfaces* VIFaceRequired.h内,编译器告诉我ValveInterfaces未定义。 (我想将VIFace公开给任何文件,包括Required.h

以下是我的文件结构:

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

错误的屏幕截图: http://i.imgur.com/lZBuB.png

3 个答案:

答案 0 :(得分:4)

第一个错误:

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

是一个死的赠品,ValveInterfaces类型在您首次尝试使用它时已定义。

这几乎总是发生,因为ValveInterfaces的类型未知。由于你已经删除了ValveInterfaces.h的大片,这有点难以辨别,但是,即使它在那里被定义,它也可能是#pragma once_REQUIRED_H的明显错位的奇怪组合。包括警卫(他们通常会在required.h中),这会让你感到悲伤。

答案 1 :(得分:3)

请注意,循环包含,如Required.hValveInterfaces.h,通常是代码气味。如果你打破循环引用,那么这些问题就不太可能出现了。

你可以尝试做的是在ValveInterfaces.h尽可能多地向前宣布并保持自足。它看起来不像ValveInterfaces需要来自Requires.h的所有东西,所以不要包含它。

#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

答案 2 :(得分:1)

您正在使用ValveInterface(单数),但声明ValveInterfaces(复数)。