Sure we can. Recompile glibc, dynamic linking, pow.
I wouldn't say that bug you referenced is a strike against C; it could happen in any language that was locale-aware and parsing floats.
For what it's worth, these macros in libcperciva are perfectly readable and maintainable:
#define ELASTICARRAY_DECL(type, prefix, rectype) \
static inline struct prefix##_struct * \
prefix##_init(size_t nrec) \
{ \
struct elasticarray * EA; \
\
EA = elasticarray_init(nrec, sizeof(rectype)); \
return ((struct prefix##_struct *)EA); \
} \
...
The advice should really be "be careful, it's really easy to write shitty macros, so don't".