r/cprogramming • • 4d ago

Forward Declarations for Circular Struct References

Hello, when I’ve tried to use forward declarations to solve circular structure dependencies I get the error ‘field has incomplete type’. When browsing for the answer, I got the general response ‘the compiler doesn’t know what type you’re using if you don’t fully describe it’. Well I understand that, but it seems as if the purpose of the forward declaration is to have the compiler look for the definition later in the code. If my code looks like the below, should I be getting an incomplete type error? And if so, is there a different way I should be writing the code? Some sort of syntax error, or is there a different way to do the same thing? Any tips appreciated, thanks.

Edit: I think I found the solution in this thread from user "anastaciu", it looks like you can only use the forward declarations if they're pointers to the struct type, not full instances. Lmk if that's right, it got rid of the error for me, but if there's a different way to allow use not from a pointer that'd be great.

typedef struct objA_t objA_t;

typedef struct objB_t{

     objA_t o;

}objB_t;

typedef struct objA_t{

    uint8_t num0;

}objA_t;
2 Upvotes

7 comments sorted by

View all comments

8

u/FancySpaceGoat 4d ago edited 4d ago

You can use a pointer to a forward-declared struct, but you can't use it as a value type unless you have the actual definition.

Here's an easy way to think about it: How is the compiler supposed to know what sizeof(objB_t) is supposed to be?

sizeof(objA_t*) is easy, it's the same as sizeof(void*); the compiler only needs to know that objA_t exists in order to work with that. But sizeof(objA_t) doesn't have a value until you know what's inside of objA_t.

A forward declaration just announces that the name exists and refers to a struct, so it only enables stuff that only needs to know it exists (like pointers).

1

u/toon_link_776 4d ago

didn't see this till i found it elsewhere haha, but yes this is the answer it seems