2012-01-16 16 views
5

मैं विज़ुअल सी ++ एक्सप्रेस का उपयोग कर एक DLL बना रहा हूं, और जब Required.h अंदर extern ValveInterfaces* VIFace घोषित करने, संकलक मुझे बता रहा है कि ValveInterfaces परिभाषित नहीं है।निर्वासन कीवर्ड "लापता प्रकार निर्दिष्टकर्ता"

DLLMain.cpp

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

ValveInterfaces* VIFace; 

//the rest of the file 

Required.h

:

यहाँ (मैं Required.h सहित किसी भी फाइल करने के लिए VIFace बेनकाब करना चाहते हैं) मेरी फ़ाइलों की संरचना है

#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

आप गार्ड शामिल हैं के लिए आरक्षित नाम का उपयोग नहीं करना चाहिए। हालांकि यह अपने विशेष समस्या का कारण नहीं है, यह [इसी तरह की समस्याओं] पैदा कर सकता है (http://stackoverflow.com/questions/3345159/ (कि 'ValveInterfaces.h' के परिपत्र शामिल किए जाने और' Required.h' की वजह से है) इन-सी क्या-तो-विशेष-के बारे में-चाल-ज)। –

उत्तर

4

यह पहला त्रुटि:

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

एक मृत सस्ता है कि ValveInterfaces प्रकार नहीं है परिभाषित किया गया है डी उस बिंदु पर जहां आप इसे पहले इस्तेमाल करने का प्रयास करते हैं।

यह लगभग हमेशा होती है क्योंकि ValveInterfaces का प्रकार अज्ञात है। यह कहना मुश्किल है क्योंकि आपने ValveInterfaces.h के विशाल स्वैच काट दिया है, लेकिन अगर इसे परिभाषित किया गया है, तो यह #pragma once का अजीब संयोजन हो सकता है और _REQUIRED_H के स्पष्ट गलत स्थान में गार्ड शामिल हैं (वे आमतौर पर required.h में होंगे) आपको दुःख का कारण बन रहा है।

+0

हुह, कि मैं क्या सोचा है, लेकिन क्यों है ना? इससे पहले कि मैं इसे एक बाहरी के रूप में घोषित करता हूं, मैंने हेडर फ़ाइल शामिल की। –

+3

मैंने पूरे ValveInterfaces.h को चिपकाया है। मुझे लगता है कि मेरी समस्या यह है कि ValveInterfaces.h Required.h सहित है, जिसमें ValveInterfaces.h भी शामिल है। –

+0

आप सही हो सकते हैं। मैं पूरी तरह से 'प्रगति' को छोड़ दूंगा और अधिक पोर्टेबल गार्ड का उपयोग करूँगा। और परिपत्र संदर्भों से छुटकारा पाएं। – paxdiablo

1

आप ValveInterface (एकवचन) का उपयोग कर रहे हैं लेकिन ValveInterfaces (बहुवचन) घोषित कर रहे हैं।

+0

क्षमा करें, यह गलत में टाइप ... ValveInterfaces होना चाहिए, यह संपादित। Intellisense त्रुटि का पता नहीं लगाता है (?) –

3

ध्यान दें कि सर्कुलर समावेशन, जैसे कि आपके पास Required.h और ValveInterfaces.h है, आमतौर पर कोड गंध होता है। यदि आप परिपत्र संदर्भ को तोड़ते हैं, तो इस तरह की समस्याएं आने की संभावना कम होती हैं।

आप क्या कोशिश करते हैं और ऐसा करने के लिए आगे ValveInterfaces.h में आप कर सकते हैं जितना की घोषणा और यह आत्म निहित रखना कर सकते हैं। ऐसा लगता है कि वाल्वइंटरफेस को 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 
संबंधित मुद्दे