The classic C90 version of the flexible array member (called the "struct hack") works fine in C++. So does the standard
offsetof macro as well as
containerof.
The classic struct hack looks like:
struct header {
size_t size;
char data[1]; // not [0]
};
the size of the structure to just before
data is
offsetof(struct header, data).
Automatic void casts are a misfeature in both languages; more so in C. In code that I control, I use a pointer to a character type as an "any memory" type, so that it requires a cast in both directions:
E.g.
typedef unsigned char mem_t;
a custom allocator or allocator wrapper will return a pointer to mem_t.
I use macros for casts, which compile to the classic C cast in C, and the more restricted casts in C++:
#ifdef __cplusplus
#define strip_qual(TYPE, EXPR) (const_cast<TYPE>(EXPR))
#define convert(TYPE, EXPR) (static_cast<TYPE>(EXPR))
#define coerce(TYPE, EXPR) (reinterpret_cast<TYPE>(EXPR))
#else
#define strip_qual(TYPE, EXPR) ((TYPE) (EXPR))
#define convert(TYPE, EXPR) ((TYPE) (EXPR))
#define coerce(TYPE, EXPR) ((TYPE) (EXPR))
#endif
The GNU C++ compiler has a cool feature:
-Wold-style-cast. With this I can pinpoint uses of the casting notation, and then replace them with these macros.
The stupid void star thing and its conversion rules should never have been invented. C++'s treatment of it is more sane, at least, by working without a cast in only one direction.
What's really awful is official API's that use void star for opaque handles. The Kronos Group's OpenMax is one of these. You can mix up different kinds of handles for different objects and the calls will compile.