The IDE does some amount of post processing of the .ino/.pde file to make a C++ file. Mostly this is to add the standard Arduino include files, and to find functions in the .ino/.pde file and add forward references before the use so that Arduino users don't have to worry about declaring functions. It then looks through all of the #include files to find the libraries. It copies each of these libraries into separate sub-directories, and then compiles every thing, making an executable file, and converts the executable file into a format (Intel ihex?) for uploading to the board.
What changed is around the GCC 4.5 version, the AVR compiler rewrote the PROGMEM handling, and it is a bit stricter than it was previously. I don't know all of the details (other than it now uses the named address extension I put into the GCC for a different embedded processor). As I understand it, the original implementation was something of a hack, and when they changed it, it generally made things better, but as with any change, some things got broken.
I haven't bothered updating the AVR compiler to something newer than what the Arduino team released. For both ARM and AVR projects I stick with the compilers provided, even though it raises my hackels that the AVR compiler is so old. Sure, I could do the build latest from trunk, etc. but frankly this is a hobby for me. I do enough of building and debugging GCC for my day job..
For the nonce, you probably don't have to worry about newer AVR compilers if you stick with the compilers provided by the Arduino team (which Teensy does use). You probably should pick up a C++ text to learn about const (it is slightly different from C). Until you get newer AVR compilers, you don't need to worry about changes in that compiler (there are people who've done it, do a google search for AVR PROGMEM), so you just need to get ARM and AVR to use a common syntax.