I'm pretty well versed in C++, and every time I try to write something in C, I fall back to C++. I find memory management a pain without RAII, error handling a hassle without exceptions, and, well, anything really a pain without some sort of standard container library.
I have the idea that there's good alternatives for these in C-land, but I'm unfamiliar with them and would love for an expert to teach me.
In general, I wonder whether there's really that many people who know C but not C++. This might just be me projecting myself onto the world, though. Anyone?
In C11 there is type generic macros that helps writing C++-like overloaded functions.
There are several extensions in GCC too.
For RAII-like memory management, there are __attribute__((constructor)) and __attribute__((destructor)).
C++ does type reflection on constant expressions via type traits templates, in GCC there is simply typeof().
If you are bored about writing static function modifiers, you can write a function inside function.
If you want to allocate a vector which won't change capacity and be released when out of local scope , for example in C++:
auto v = std::vector<int>(n);
int v[n]; // n is a variable determined at runtime
Still, it's a nice hack for when you want to write C++-like code while still using C constructs only.
That said, my first underbelly reaction is that I don't want to write C++-like code in C. Why would I do that? I might as well use C++ then. It's like writing functional code in Java. It's possible, but it's a hack.
What I'd like to learn is how to decently deal with memory, exceptional behaviour, common data structures, etc in modern idiomatic C. Some other people in this thread made some nice suggestions for that, btw, so thanks guys :)
That statement is true. But, as you may be aware, it doesn't encompass quite a few use-cases. A lot of usecases require you to have fine control over performance and using RAII will cause random speed-bumps. for e.g. when a ref-counted smart pointer(s) goes out of scope and triggers 'heavy' destructors on held objects to free up resources - at a non-deterministic time.
It's certainly not standard, but I wrote a nice little generic list library you might be interested in: http://github.com/udp/list
It uses GNU extensions, but can fallback on C++ instead if you need to build with MSVC.
AIUI exceptions and RAII are mutually exclusive in C++. I don't know enough about C++ so i wouldn't be surprised to find out this is wrong.
That is... very wrong. Exceptions are perilous unless you use RAII religiously (which you should; it's good.)
For more information, read up on RAII and search for "exception safety."
The definition of C++ RAII from Wikipedia: "In this language, if an exception is thrown, and proper exception handling is in place, the only code that will be executed for the current scope are the destructors of objects declared in that scope". Without this it is very hard to reap any benefits of exceptions (people have disagreements on what those are, if any, but that's another topic).
I also found this which I thought was a high quality summary: http://www.parashift.com/c++-faq-lite/ctors-can-throw.html
In fact, I'd argue that you very often have to use RAII with exceptions, since there's no 'finally' block on a try-catch statement and hence it's the easiest way to ensure stuff gets cleaned up (well, except for catch(...) and rethrowing, but that's kinda ugly).
Every time I write C code is at a gun point of being forced to do so. When I have the choice between C++ and C, I always pick up C++.