struct declaration (silly question)

  • Thread starter Marcin Kasprzak
  • Start date
M

Marcin Kasprzak

Hello Guys,
Silly question - what is the most elegant way of compiling a code similar
to this one?

<code>
typedef struct a {
b_t *b;
} a_t;

typedef struct b {
a_t *a;
} b_t;

int main(void) {

return 0;
}
</code>

my solution is to simply change type "b_t" to "void" but I'm not sure
if that's the best way of dealing with this issue.

Thanks,
 
B

Ben Pfaff

Marcin Kasprzak said:
Silly question - what is the most elegant way of compiling a code similar
to this one?
[code for mutually referential structures]

Refer to the C FAQ.

1.14: I can't seem to define a linked list successfully. I tried

typedef struct {
char *item;
NODEPTR next;
} *NODEPTR;

but the compiler gave me error messages. Can't a structure in C
contain a pointer to itself?

A: Structures in C can certainly contain pointers to themselves;
the discussion and example in section 6.5 of K&R make this
clear. The problem with the NODEPTR example is that the typedef
has not been defined at the point where the "next" field is
declared. To fix this code, first give the structure a tag
("struct node"). Then, declare the "next" field as a simple
"struct node *", or disentangle the typedef declaration from the
structure definition, or both. One corrected version would be

struct node {
char *item;
struct node *next;
};

typedef struct node *NODEPTR;

and there are at least three other equivalently correct ways of
arranging it.

A similar problem, with a similar solution, can arise when
attempting to declare a pair of typedef'ed mutually referential
structures.

See also question 2.1.

References: K&R1 Sec. 6.5 p. 101; K&R2 Sec. 6.5 p. 139; ISO
Sec. 6.5.2, Sec. 6.5.2.3; H&S Sec. 5.6.1 pp. 132-3.
 
W

William Pursell

Silly question - what is the most elegant way of compiling a code similar
to this one?

<snip code>

Others have mentioned the FAQ which deals with the necessary
forward declaration, but as a point of style, I recommend:

struct b;
struct a {
struct b *b;
};

struct b {
struct a *a;
};

Note that your question is phrased poorly, since this has
nothing to do with compiling, but with writing syntactically
correct code that will compile. Also note that it is not
necessary to include main() in order to compile. main()
is only needed to link. (eg, 'gcc -c foo.c' will compile
foo.c and generate foo.o, and no main() is necessary.)
 
W

William Pursell

Others have mentioned the FAQ which deals with the necessary
forward declaration, but as a point of style, I recommend:

Ergg...no forward declaration necessary, of course. I
was distracted by the typedef's and '_t's and mistook
the question for a different FAQ.
 

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,744
Messages
2,569,484
Members
44,903
Latest member
orderPeak8CBDGummies

Latest Threads

Top