внешнее ключевое слово "отсутствующий спецификатор типа" - PullRequest
5 голосов
/ 16 января 2012

Я создаю DLL с использованием Visual C ++ Express и при объявлении 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

Ответы [ 3 ]

4 голосов
/ 16 января 2012

Эта первая ошибка:

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

- мертвая раздача, которую тип ValveInterfaces имеет , а не , который был определен в точке, где вы впервые пытаетесь его использовать.

Это почти всегда происходит, потому что тип ValveInterfaces неизвестен.Это немного сложно сказать, так как вы вырезали огромные полосы ValveInterfaces.h, но, даже если он там определен, это может быть странная комбинация #pragma once и очевидное неправильное размещение _REQUIRED_H включающих охранников (они будутобычно пребывает в required.h), что вызывает у вас горе.

3 голосов
/ 16 января 2012

Обратите внимание, что циклическое включение, например, как у вас Required.h и ValveInterfaces.h, обычно является запахом кода. Если вы нарушите круговую ссылку, проблемы, подобные этим, будут возникать с меньшей вероятностью.

То, что вы можете попробовать и сделать, - это объявить вперед как можно больше в ValveInterfaces.h и оставить его автономным. Не похоже, что ValveInterfaces требует всего от Requ.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
1 голос
/ 16 января 2012

Вы используете ValveInterface (единственное число), но объявляете ValveInterfaces (множественное число).

...