2008-11-28 15 views

उत्तर

10

इस पृष्ठ को forward references पर देखें। मैं नहीं देखता कि पॉइंटर्स और अन्य पीओडी प्रकारों के साथ आगे संदर्भ कैसे अलग होगा।

ध्यान दें कि आप प्रकार की घोषणा अग्रेषित कर सकते हैं, और चर जो उस प्रकार के संकेत दिए गए हैं की घोषणा:

struct MyStruct; 
struct MyStruct *ptr; 
struct MyStruct var; // ILLEGAL 
ptr->member; // ILLEGAL 

struct MyStruct { 
    // ... 
}; 

// Or: 

typedef struct MyStruct MyStruct; 
MyStruct *ptr; 
MyStruct var; // ILLEGAL 
ptr->member; // ILLEGAL 

struct MyStruct { 
    // ... 
}; 

मुझे लगता है कि यह आप जब संकेत और आगे घोषणा से निपटने के लिए क्या पूछ रहे है।

+0

ठीक यू धन्यवाद, लेकिन मैं यह मान सकते हैं वहाँ thsi मामले –

+0

हाँ में संकेत के साथ कोई अंतर नहीं है: चर संकेत चर हैं, के रूप में सी में इस स्थिति को व्यक्त करने के लिए एक ही रास्ता एक आगे घोषणा, यानी उपयोग करने के लिए है पूर्णांक चर हैं। – strager

7

मुझे लगता है कि संकेत के संबंध में "आगे संदर्भ" कुछ इस तरह का अर्थ है:

struct MyStruct *ptr; // this is a forward reference. 

struct MyStruct 
{ 
    struct MyStruct *next; // another forward reference - this is much more useful 
    // some data members 
}; 

सूचक घोषित किया जाता है संरचना से पहले यह बताते हैं परिभाषित किया गया है करने के लिए।

कंपाइलर इससे दूर हो सकता है क्योंकि सूचक एक पता संग्रहीत करता है, और आपको यह जानने की आवश्यकता नहीं है कि सूचक के लिए स्मृति को आरक्षित करने के लिए उस पते पर क्या है।

5

अग्रेषित संदर्भ तब होता है जब आप एक प्रकार घोषित करते हैं लेकिन इसे परिभाषित नहीं करते हैं।

यह आपको पॉइंटर (या सी ++ के संदर्भ) के प्रकार का उपयोग करने की अनुमति देता है लेकिन आप एक चर घोषित नहीं कर सकते हैं।

struct Plop 
{ 
    int n; 
    float f; 
}; 

अब आप कुछ उपयोगिता कार्यों जोड़ना चाहते हैं:

इस संकलक कि कुछ मौजूद है

को कहने का एक तरीका आप एक खटखटाने संरचना Plop.h में परिभाषित किया गया है कि कहते हैं वह उस संरचना के साथ काम करता है। जब भी उन समारोह को लागू

struct Plop; // Instead of including Plop.h, just use a forward declaration to speed up compile time 

void doSomething(Plop* plop); 
void doNothing(Plop* plop); 

अब, आप संरचना परिभाषा की आवश्यकता होगी ताकि आप खटखटाने शामिल करने की जरूरत: आप किसी अन्य फ़ाइल PlopUtils.h (मान लीजिए कि आप Plop.h नहीं बदल सकते हैं) बनाने अपने PlopUtils.cpp में ज फ़ाइल:

#include "PlopUtils.h" 
#include "Plop.h" // now we need to include the header in order to work with the type 

void doSomething(Plop* plop) 
{ 
    plop->n ... 
} 

void doNothing(Plop* plop); 
{ 
    plop->f ... 
} 
-5

फॉरवर्ड संदर्भ सी संकलक कम गुजरता ऐसा करने की अनुमति और काफी संकलन समय कम कर देता है। यह संभवतः 20 साल पहले महत्वपूर्ण था जब कंप्यूटर बहुत धीमे थे और अनुपालन कम कुशल थे।

3

मुझे लगता है कि सी कंपाइलर मूल रूप से एक पास था जिसमें यह प्रतीक तालिका निर्माण और अर्थपूर्ण विश्लेषण एक साथ था। उदाहरण के लिए:

.... 
    ... foo(a,b) + 1 ... // assumes foo returns int 
    .... 

    double foo(double x, double y){ ... } // violates earlier assumption 

इसे रोकने के लिए, आप कहते हैं:

double foo(double x, double y); // this is the forward declaration 

    .... 
    ... foo(a,b) + 1 ... // correct assumptions made 
    .... 

    double foo(double x, double y){ ... } // this is the real declaration 

पास्कल इसी अवधारणा थी।

2

पिछले उत्तरों में जोड़ें।सामान्य स्थिति जिसमें आगे संदर्भ अनिवार्य है, जब एक स्ट्रक्चर फू में स्ट्रक्चर बार में पॉइंटर होता है, और बार में foo (घोषणाओं के बीच एक गोलाकार निर्भरता) के लिए एक सूचक होता है।

struct foo; 

struct bar 
{ 
    struct foo *f; 
}; 

struct foo 
{ 
    struct bar *b; 
}; 
संबंधित मुद्दे