forward declaration

R

RedLars

Need some help with a couple of questions. Previously I have seen this
declaration;
struct Student
{
int age;
char name[50];
};

and this definition of an object;
struct Student stud;

However, what does this mean?
struct AnotherStudent;

Another question, how does forward declaration really work? Say I have
these two structs and a function pointer. This wont compile as is. How
can I fix this ?

// File ObjectA.h
typedef struct
{
ObjectB b;
} ObjectA;

// File ObjectB.h
typedef struct
{
func f;
} ObjectB;

int (*func)
(
ObjectA
);
 
C

CBFalconer

RedLars said:
Need some help with a couple of questions. Previously I have seen
this declaration;

struct Student {
int age;
char name[50];
};

and this definition of an object;

struct Student stud;

However, what does this mean?

struct AnotherStudent;

In the context, absolutely nothing. You have a type, named "struct
Student" in existance. I suspect the writer meant to define
another object as:

struct Student AnotherStudent;

which would work.
 
B

borophyll

Need some help with a couple of questions. Previously I have seen this
declaration;
struct Student
{
int age;
char name[50];

};

and this definition of an object;
struct Student stud;

However, what does this mean?
struct AnotherStudent;

It's a forward declaration
Another question, how does forward declaration really work? Say I have
these two structs and a function pointer. This wont compile as is. How
can I fix this ?

// File ObjectA.h
typedef struct
{
ObjectB b;

} ObjectA;

// File ObjectB.h
typedef struct
{
func f;

} ObjectB;

int (*func)
(
ObjectA
);

Your first question answers this. Just put a forward declaration for
ObjectA at the top of the file ObjectB.h, and vice versa.
 
R

RedLars

Need some help with a couple of questions. Previously I have seen this
declaration;
struct Student
{
int age;
char name[50];

and this definition of an object;
struct Student stud;
However, what does this mean?
struct AnotherStudent;

It's a forward declaration

What does a forward declaration mean? It seems like its 'creating' a
type without defining it's content? How can I later define a forward
declaration's content? This (code below) would not compile, whats the
correct pattern of using forward declaration?

// file abc.h
struct AnotherStudent;

// file xyz.h
struct AnotherStudent { int x, long y, char z };
 
B

borophyll

What does a forward declaration mean? It seems like its 'creating' a
type without defining it's content?

Correct, it is declaring a type without defining it, so that you can
use the type in other declarations.


How can I later define a forward
declaration's content?

Just do it. For example:

//objA.h

struct ObjB;

struct ObjA {
struct ObjB * b;
};

//objB.h

struct ObjA;

struct ObjB {
struct ObjA * b;
};

This (code below) would not compile, whats the
correct pattern of using forward declaration?

// file abc.h
struct AnotherStudent;

// file xyz.h
struct AnotherStudent { int x, long y, char z };

It doesn't compile because you are using commas instead of semicolons
to separate
each member.
 
R

RedLars

Correct, it is declaring a type without defining it, so that you can
use the type in other declarations.

How can I later define a forward


Just do it. For example:

//objA.h

struct ObjB;

struct ObjA {
struct ObjB * b;

};

//objB.h

struct ObjA;

struct ObjB {
struct ObjA * b;

};

This (code below) would not compile, whats the




It doesn't compile because you are using commas instead of semicolons
to separate
each member.

Thanks for your reply.

Not sure if this is the right thread for a couple of new questions but
here goes;
From what I understand this is declaration of a struct;
struct person
{
char * first;
char *last;
int age;
};

And to use this type (allocate memory);
struct person p;

What about this bit of code;
struct
{
char * first;
char *last;
int age;
} person;

Is this equivalent to the first example? If not, what is the
difference?

By adding 'typedef' infront of both these code blocks;
typedef struct person {...};
typedef struct {...} person;
What does that accomplish? Have read in a tutorial that you dont have
to write;
struct person p;
but can instead write;
person p;

Is that the only difference? It doesnt change the scope of the
variable or anything else behind the scenes? Just makes the code
easier to read.

Thanks for any input.
 
K

Keith Thompson

RedLars said:
From what I understand this is declaration of a struct;
struct person
{
char * first;
char *last;
int age;
};

The unqualified phrase "a struct" can be ambiguous; it can refer
either to a struct type or to an object (variable) of a struct type.

The above declares a struct type called "struct person".
And to use this type (allocate memory);
struct person p;

Right, that declares (and defines) an object of type "struct person".
What about this bit of code;
struct
{
char * first;
char *last;
int age;
} person;

Is this equivalent to the first example? If not, what is the
difference?

In your first example, the type is named "struct person" and the
object is named "p". In your second example, the type has no name
(which is bad if you ever want more than one object) and the object is
named "person". Other than that, they're equivalent.
By adding 'typedef' infront of both these code blocks;
typedef struct person {...};

That's invalid; what you want is

typedef struct person {...} person;

The first "person" is the struct tag; the second is the typedef name.
You can use the same identifier for both, since a struct tag always
immediately follows the keyword "struct".
typedef struct {...} person;

Here the struct has no tag (which is ok); its only name is the typedef
name "person".
What does that accomplish? Have read in a tutorial that you dont have
to write;
struct person p;
but can instead write;
person p;

Is that the only difference? It doesnt change the scope of the
variable or anything else behind the scenes? Just makes the code
easier to read.

A typedef creates an alias for an existing type. That's *all* it
does.

There's a (mostly good-natured) controversy about whether typedefs for
structs are a good idea.

The argument against them is that the type already has a perfectly
good name, and defining an alias doesn't buy you anything; you can
just refer to it everywhere as "struct person" This is more explicit;
the code that uses the type needs to know that it's a struct type
anyway. (The exception is when it's truly an abstract type whose
innards should be hidden from code that uses it; FILE is an example of
this.)

On the other hand, a typedef for a struct does give you a one-word
name for the type, and plenty of programmers feel that this
convenience is worthwhile. <OT>Note that C++ lets you refer to
"struct person" as just "person"; a typedef lets you do the same thing
in C.</OT>

Note that the typedef name isn't available until the end of the
declaration, so you generally have to use the struct tag within the
struct declaration itself:

typedef struct person {
char *name;
struct person *father;
struct person *mother;
} person;
person you;

There are more issues I haven't gone into (whether the typedef name
really should be the same as the struct tag, and if not, how they
should be related; whether the typedef and struct should be declared
together or in separate declarations; and so forth).
 
B

Barry Schwarz

Need some help with a couple of questions. Previously I have seen this
declaration;
struct Student
{
int age;
char name[50];
};

and this definition of an object;
struct Student stud;

However, what does this mean?
struct AnotherStudent;

Another question, how does forward declaration really work? Say I have
these two structs and a function pointer. This wont compile as is. How
can I fix this ?

// File ObjectA.h
typedef struct
{
ObjectB b;
} ObjectA;

// File ObjectB.h
typedef struct
{
func f;
} ObjectB;

int (*func)
(
ObjectA
);

It is not possible to have two structure types, each of which has a
member of the other type. This cannot work
struct A (struct B b;} x;
struct B (struct A a;} y;
because the compiler would need to know the size of struct B in order
to define x which it cannot know because struct B has not yet been
defined. Reversing the order of definition simply changes the problem
to knowing the size of struct A.

However, it is possible to have two structure types, each of which has
a member of type pointer to the other type. This is because all
pointers to struct have the same size, alignment, and representation.
This does work
struct B; /*forward definition of incomplete struct type*/
struct A (struct B *b;} x;
struct B (struct A *a;} y; /*complete the struct type*/
because the sizes of x and y no longer depend on the sizes of struct A
and B but only on the sizes of pointers to struct A and B.

A structure is also prohibited from having a member that has function
type but is allowed to have members of pointer to function type.


Remove del for email
 
D

David Thompson

RedLars <[email protected]> writes:

That's invalid; what you want is

typedef struct person {...} person;
Nit: specifying 'typedef' with no declarator for the/a typedef name is
not what he wanted, and is at best confusing, but it is not a syntax
error or constraint violation and must be 'accepted', which I believe
is agreed to mean translated although not specifically defined.
The first "person" is the struct tag; the second is the typedef name.
You can use the same identifier for both, since a struct tag always
immediately follows the keyword "struct".
Nit: after preprocessing, or more specifically translation phase 4.
Although any program that uses a macro to cons* struct+tag might
reasonably be argued to DESERVE to fail. (* well, sort of <G>) And I
can't think offhand of any comment that would really need to go
between them rather than (immediately) before or after.

<snip rest>
- formerly david.thompson1 || achar(64) || worldnet.att.net
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,769
Messages
2,569,581
Members
45,056
Latest member
GlycogenSupporthealth

Latest Threads

Top