The C language as well as its preprocessor promotes "ambiguity", one of the most undesirable property of programming language grammar, as it significantly complicates the job of a compiler-writer as well as the life of users!
Oberon, Modula2 as well as Pascal are focused on "interfaces" and "being modular", while the the C language (no matter if C++, C++11, C+=whatever) still suffers of some bad design points, such as argument type transposed between function and call, functions that may be passed one argument but expected three, and too junk off the stack, variable used before being set without a warm, ambiguity in pointers...
Too bad! Does people really need to care about that? Do they need "validating-software" like MISRA-LINT?
Well .... for sure even if you could make your programming language 100% reliable, you would still be pray to catastrophic bugs in the algorithm, thus the algorithm and data are THE MOST important thing to
be focused on, no matter which language you want to use to express the algorithm, but ...
But! the syntax of C declarations is a truly mess that permeates the use of the entire language, and it's no exaggeration to say that C is significantly and needlessly complicated because of the awkward manner of combining types.
On the pragmatic side, the economics of software is such that the earlier in the development cycle a bug is found, the cheaper it is to fix. So, it's a good investment to have a language or a tool do the job to find problems rather than the debugger; but Better a debugger finds the problems than an internal test group. The worst option of all is to leave the problems to be found by customers.
This one, the last one in my lines, is one of *the* reason why we use Ada in avionics