User can define an opaque data type in C/C++ header file like below:
typedef struct DataHandle DataHandle; or
typedef struct DataHandle* PDataHandle;
It will still work even there is no definition of DataHandle.
The actual definition of the struct will be written in source file.
The user of the struct won't know any details of it(especially in a compiled library).
User will use pointer of the struct or pass a pointer to a function.
It works like private member variable and public method in C++ class.