Is it a good practice to hide structure definition in C?
Yes, it is a good practice to hide data.
As an alternate to the alloca(foo_size);
pattern, one can declare an aligned character array and perform a pointer conversion. The pointer conversion is not fully portable, though. The character array needs to be a VLA, if the size is defined by a variable and not a compile-time constant:
extern size_t size;
struct sfoo;
#include <stddef.h>
int main(void) {
unsigned char _Alignas (max_align_t) cptr[size];
// or unsigned char _Alignas (_Complex long double) cptr[size]; // some widest type
struct sfoo *sfooptr = (struct sfoo *) cptr;
...
If VLAs are not desired or available, declare the size as a constant (#define foo_N 100
) that is guaranteed to be at least as much as needed.
Function bar
invokes undefined behavior: the structure pointed to by foo
is uninitialized.
If you are going to hide the structure details, provide a foo_create()
that allocates one and initializes it and foo_finalize
that releases any resources and frees it.
What you are proposing could be made to work, but is error prone and is not a general solution.