2008-11-28 25 views

Odpowiedz

10

Zobacz tę stronę na stronie forward references. Nie widzę, jak odniesienie do przodu byłoby inne w przypadku wskaźników i innych typów PoD.

pamiętać, że można przekazać deklarować typy i zadeklarować zmienne, które są wskaźnikami do tego typu:

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 { 
    // ... 
}; 

myślę, że to, o co prosisz, gdy do czynienia ze wskaźnikami i deklaracji do przodu.

+0

ok thank u, ale mogę założyć, że nie ma żadnej różnicy ze wskaźnikami w thsi przypadku –

+0

Tak: pointers zmiennych są zmienne, jak są zmiennymi całkowitymi. – strager

7

myślę „naprzód odniesienie” w odniesieniu do wskaźników oznacza coś takiego:

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

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

wskaźnik jest zadeklarowane przed struktury to wskazuje jest zdefiniowana.

Kompilator może sobie z tym poradzić, ponieważ wskaźnik zapisuje adres, a użytkownik nie musi wiedzieć, co znajduje się pod tym adresem, aby zarezerwować pamięć dla wskaźnika.

5

Odsyłacz do przodu występuje wtedy, gdy deklarujesz typ, ale go nie definiujesz.

Pozwala na użycie typu po kursie (lub odwołanie do C++), ale nie można zadeklarować zmiennej.

Jest to sposób powiedzieć kompilator, że coś istnieje

powiedzieć, że masz struktura Plop zdefiniowane w Plop.h:

struct Plop 
{ 
    int n; 
    float f; 
}; 

Teraz chcesz dodać kilka funkcji użytkowych który działa z tą strukturą. Utworzyć kolejny plik PlopUtils.h (powiedzmy, że nie można zmienić 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); 

Teraz podczas realizacji tych funkcji, trzeba będzie definicję struktury, więc trzeba zawierać PLOP plik .h w 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

referencje forward pozwalają kompilatora C zrobić mniej podań i znacznie skraca czas kompilacji. Prawdopodobnie było to ważne około 20 lat temu, kiedy komputery były znacznie wolniejsze, a kompilatory mniej wydajne.

3

Myślę, że kompilator języka C miał początkowo przepustkę, w której wspólnie tworzył tabelę symboli i analizę semantyczną. Tak więc na przykład:

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

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

aby temu zapobiec, można powiedzieć:

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 

Pascal miał tę samą koncepcję.

2

Dodawanie do poprzednich odpowiedzi.Typowa sytuacja, w której odniesienie do przodu jest obowiązkowe, występuje wtedy, gdy struct foo zawiera wskaźnik do paska strukturalnego, a pasek zawiera wskaźnik do foo (zależność cykliczna między deklaracjami). Jedynym sposobem, aby wyrazić tę sytuację w C jest użycie do przodu deklarację, a mianowicie:

struct foo; 

struct bar 
{ 
    struct foo *f; 
}; 

struct foo 
{ 
    struct bar *b; 
};