LLVM is a good option.
http://llvm.org/docs/FAQ.html#translatecxx
It handles some code, but will fail for more complex implementations
as it hasn't been fully updated for some of the modern C++
conventions. So try compiling your code frequently until you get a
feel for what's allowed.
Usage sytax from the command line is as follows for version 9.0.1:
clang -c CPPtoC.cpp -o CPPtoC.bc -emit-llvm
clang -march=c CPPtoC.bc -o CPPtoC.c
For older versions (unsure of transition version), use the following
syntax:
llvm-g++ -c CPPtoC.cp -o CPPtoC.bc -emit-llvm
llc -march=c CPPtoC.bc -o CPPtoC.c
Note that it creates a GNU flavor of C and not true ANSI C. You will
want to test that this is useful for you before you invest too
heavily in your code. For example, some embedded systems only accept
ANSI C.
Also note that it generates functional but fairly unreadable code. I
recommend commenting and maintain your C++ code and not worrying
about the final C code.