The language itself is actually okay for general-purpose use. But all the "best practices" are utter garbage. Excessive overuse of OOP, refusal to use raw data types, bloated and unnecessary functions and code, bottom-up design...almost every C++ codebase I see is an undecipherable mess. To get one variable it goes through 20 different classes and 5 different sockets, and functions are spread out all over the place in 10 different classes and inheritance trees. And it has to be completely rewritten to tweak the object model it's built on. Working with these is ugly, sucks that there's not many C libraries out there, and for things like GUI you're pretty much forced to use C++ (and a lot of things don't even have a C++ library). This is the real reason C is "hard", because there's no libraries for it. Not because it doesn't have a lot of high-level abstractions like people try to say. Sometimes I'm seriously tempted to reinvent the wheel to avoid all of this.
Some of the features aren't even that useful. It's probably easier to deal with structs than classes. STL's OOP replacements of raw data types are just slower versions of the same thing with weird syntax. Operator overloading makes expensive operations seem trivial. References are the same thing as pointers. Really the only advantages I can see are templates and a few STL features.
On the flip side C++ is lacking some pretty useful C features, such as
restrict (which is terminally underused). There are hacky ways to get most of these things in C++, but they are not portable. I feel like most C features are there for added functionality, and the C++ ones are mostly about providing more complicated ways to express something. The only thing C++ really makes easier is templates, which is annoying to implement with macros.
And sometimes maintaining compatibility with C++ makes it difficult or impossible to use some of C's features. Even with
extern "C" you can't use any C-specific features in the function and variable declarations, including arguments. They have to be the lowest common denominator of both languages.