我正在使用Visual C ++ Express创建一个DLL,并在声明时
extern ValveInterfaces* VIFace
在Required.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
答案 0 :(得分:4)
第一个错误:
error C2143: syntax error : missing ';' before '*'
是一个死的赠品,ValveInterfaces
类型在您首次尝试使用它时未已定义。
这几乎总是发生,因为ValveInterfaces
的类型未知。由于你已经删除了ValveInterfaces.h
的大片,这有点难以辨别,但是,即使它在那里被定义,它也可能是#pragma once
和_REQUIRED_H
的明显错位的奇怪组合。包括警卫(他们通常会在required.h
中),这会让你感到悲伤。
答案 1 :(得分:3)
请注意,循环包含,如Required.h
和ValveInterfaces.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
(复数)。