forward declaration

Collapse
This topic is closed.
X
X
 
  • Time
  • Show
Clear All
new posts
  • RedLars

    #1

    forward declaration

    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
    );

  • borophyll@gmail.com

    #2
    Re: forward declaration

    On Oct 3, 5:23 am, RedLars <Liverpool1...@ gmail.comwrote:
    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.

    Comment

    • CBFalconer

      #3
      Re: forward declaration

      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

      Comment

      • RedLars

        #4
        Re: forward declaration

        On 3 Okt, 01:40, boroph...@gmail .com wrote:
        On Oct 3, 5:23 am, RedLars <Liverpool1...@ gmail.comwrote:
        >
        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 -

        Comment

        • borophyll@gmail.com

          #5
          Re: forward declaration

          On Oct 3, 3:22 pm, RedLars <Liverpool1...@ gmail.comwrote:
          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.

          Comment

          • RedLars

            #6
            Re: forward declaration

            On 4 Okt, 06:03, boroph...@gmail .com wrote:
            On Oct 3, 3:22 pm, RedLars <Liverpool1...@ gmail.comwrote:
            >
            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.



            Comment

            • Keith Thompson

              #7
              Re: forward declaration

              RedLars <Liverpool1892@ gmail.comwrites :
              [...]
              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_Keit h) kst-u@mib.org <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"

              Comment

              • David Thompson

                #8
                Re: forward declaration

                On Sun, 07 Oct 2007 13:17:22 -0700, Keith Thompson <kst-u@mib.org>
                wrote:
                RedLars <Liverpool1892@ gmail.comwrites :
                <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.ne t

                Comment

                Working...