For myself the biggest nag in coding c(i learned after learning asm) was the type definitions in asm you call *almost* everything a dword.
That's a bit dangerous, though. Is your DWORD a numeric value, a pointer to something, or a pointer to a pointer? You get no semantic value when you call everything just a DWORD. Also, would that be a signed or unsigned DWORD?
For the most part it just feels like your 'hand-holding' the compiler which becomes tedious in itself .
It's tedious in C++ when you're using a SDK designed for C - all those typecasts. For well-designed C++ code, though, things work out a LOT better.
Lol, the coprocessor can be a gigantic pain (my PI program caused me to learn the coprocessor just for that program), I believe I have a stack overflow somewhere there to fix :/, but almost my whole program is writen using the coprocesoor instructions.