Co to jest odniesienie do przodu w C w odniesieniu do wskaźników?Co to jest odwołanie do przodu w C?
Czy mogę uzyskać przykład?
Co to jest odniesienie do przodu w C w odniesieniu do wskaźników?Co to jest odwołanie do przodu w C?
Czy mogę uzyskać przykład?
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.
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.
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 ...
}
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.
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ę.
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;
};
ok thank u, ale mogę założyć, że nie ma żadnej różnicy ze wskaźnikami w thsi przypadku –
Tak: pointers zmiennych są zmienne, jak są zmiennymi całkowitymi. – strager