But now I'd like to do the converse, call C++, and more specifically the Serial.read and Serial.write functions to read and write one byte at a time, from C.
Casting malloc is good programming practice because it documents the programmer's intention and can catch mismatches between the expected type and the actual type.
IMO anything explicit is better than implicit, and as you said "C has implicit casting to/from void*", which, still IMO, is abusing the language.
We officially disagree... Casting forces conversion whether the source is appropriate or not.
OTOH, having to cast malloc() (or provide macros/inline allocator functions) seems a small price to pay to avoid the complications of mixing C and C++ in microcontroller class applications, especially since malloc() is usually to be avoided anyway. IMO.
I believe I've made significant head way in solving my problem. The outlined extern while causing an error in my .pde file, works fine in a seperate .cpp file (for reasons beyond my few days of arduinoing experience).
I suspect the issue is that the IDE automatically generates function prototypes for your functions in the .pde file, thus disagreeing duplication thus error.