forward declaration

Discussion in 'C Programming' started by RedLars, Oct 2, 2007.

  1. RedLars

    RedLars Guest

    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
    );
    RedLars, Oct 2, 2007
    #1
    1. Advertising

  2. RedLars

    CBFalconer Guest

    RedLars wrote:
    >
    > 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.

    --
    Chuck F (cbfalconer at maineline dot net)
    Available for consulting/temporary embedded and systems.
    <http://cbfalconer.home.att.net>


    --
    Posted via a free Usenet account from http://www.teranews.com
    CBFalconer, Oct 3, 2007
    #2
    1. Advertising

  3. RedLars

    Guest

    On Oct 3, 5:23 am, RedLars <> wrote:
    > 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.
    , Oct 3, 2007
    #3
  4. RedLars

    RedLars Guest

    On 3 Okt, 01:40, wrote:
    > On Oct 3, 5:23 am, RedLars <> wrote:
    >
    > > 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 };

    >
    >
    >
    > > 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.- Skjul sitert tekst -
    >
    > - Vis sitert tekst -
    RedLars, Oct 3, 2007
    #4
  5. RedLars

    Guest

    On Oct 3, 3:22 pm, RedLars <> wrote:

    > 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.
    , Oct 4, 2007
    #5
  6. RedLars

    RedLars Guest

    On 4 Okt, 06:03, wrote:
    > On Oct 3, 3:22 pm, RedLars <> wrote:
    >
    > > 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.


    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.
    RedLars, Oct 7, 2007
    #6
  7. RedLars <> writes:
    [...]
    > 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).

    --
    Keith Thompson (The_Other_Keith) <http://www.ghoti.net/~kst>
    San Diego Supercomputer Center <*> <http://users.sdsc.edu/~kst>
    "We must do something. This is something. Therefore, we must do this."
    -- Antony Jay and Jonathan Lynn, "Yes Minister"
    Keith Thompson, Oct 7, 2007
    #7
  8. On Tue, 02 Oct 2007 12:23:20 -0700, RedLars <>
    wrote:

    >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
    Barry Schwarz, Oct 10, 2007
    #8
  9. On Sun, 07 Oct 2007 13:17:22 -0700, Keith Thompson <>
    wrote:

    > RedLars <> writes:

    <snip>
    > > By adding 'typedef' infront of both these code blocks;
    > > typedef struct person {...};

    >
    > 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
    David Thompson, Oct 22, 2007
    #9
    1. Advertising

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

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Aaron Anodide
    Replies:
    1
    Views:
    373
    Victor Bazarov
    Aug 1, 2003
  2. Alexander Grigoriev

    GCC and forward declaration of enum

    Alexander Grigoriev, Sep 12, 2003, in forum: C++
    Replies:
    11
    Views:
    1,284
    Gianni Mariani
    Sep 14, 2003
  3. Kevin Grigorenko

    Class forward declaration

    Kevin Grigorenko, Sep 15, 2003, in forum: C++
    Replies:
    6
    Views:
    6,715
    Kevin Grigorenko
    Sep 15, 2003
  4. Lem

    forward declaration?

    Lem, Sep 21, 2003, in forum: C++
    Replies:
    12
    Views:
    749
    jeffc
    Sep 22, 2003
  5. qazmlp
    Replies:
    1
    Views:
    594
    Jonathan Turkanis
    Feb 15, 2004
Loading...

Share This Page