Связано, но не совсем скрыто.
Это условно осуждает членов.
Обратите внимание, что это работает для GCC / Clang, но MSVC и другие компиляторы тоже могут устареть,
так что можно придумать более портативную версию.
Если вы создаете с довольно строгими предупреждениями или предупреждениями как ошибками, это по крайней мере позволяет избежать случайного использования.
// =========================================
// in somestruct.h
#ifdef _IS_SOMESTRUCT_C
# if defined(__GNUC__)
# define HIDE_MEMBER __attribute__((deprecated))
# else
# define HIDE_MEMBER /* no hiding! */
# endif
#else
# define HIDE_MEMBER
#endif
typedef struct {
int _public_member;
int _private_member HIDE_MEMBER;
} SomeStruct;
#undef HIDE_MEMBER
// =========================================
// in somestruct.c
#define _IS_SOMESTRUCT_C
#include "somestruct.h"
SomeStruct *SomeStruct_Create()
{
SomeStructSource *p = (SomeStructSource *)malloc(sizeof(SomeStructSource));
p->_private_member = 42;
return (SomeStruct *)p;
}