On my compiler, from QNX but based on gcc 4.4.2, using -save-temps only gives me the assembly files (and no preprocessor files).
I can't verify that for such an old version of GCC, or any QNX variant. Certainly all mainline GCC versions at least as old as 4.7 respect ... -c -save-temps foo.c by saving the preprocessed source in foo.i and the assembly in foo.s.
But if that's the case with your QNX GCC 4.4.2, there's a workaround.
From your comments it appears that your objection to invoking the compiler twice is that you do not want time to be wasted in preprocessing the source twice. But you can invoke the compiler twice, once to do the preprocessing only, and again to do the compiling only, so I presume that would be a satisfactory solution.
Your wished-for command line:
gcc -E -c main.cc -o main.o
shows a C++ source file being given to the C compiler. I assume that's a slip. The recipes for the outcome you're after are symmetrically different for C and for C++.
For C you want:
gcc -E main.c > main.i && gcc -c -o main.o main.i
For C++ you want:
g++ -E main.cc > main.ii && g++ -c -o main.o main.ii
This writes the preprocessed C[C++] output that you want to save to main.i[.ii] and then passes that preprocessed output to the compiler again for C[C++] compilation. gcc[g++] recognizes the file extension .i[.ii] as denoting C[C++] source code that should not be preprocessed. See 3.2 Options Controlling the Kind of Output; so it will not attempt to preprocess the source again.
This solution also has the merit of not generating the assembly files, which you don't want.
-Eoption:(...) and one of the options -c, -S, or -E to say where gcc is to stop- "to stop" does not leave much hope in doing that in one step.