By example, in a code of a graphic LCD library, to set or clear the "chip select" pin, you had to write:
#define GLCD_CMD_PORT PORTA // Command Output Register
#define GLCD_CSEL1 0x03 // CS1 Bit Number
#define GLCD_CSEL2 0x04 // CS2 Bit Number
GLCD_CMD_PORT |= 0x01 << GLCD_CSEL1; // select chip 1
GLCD_CMD_PORT &= ~(0x01 << GLCD_CSEL2); // deselect chip 2
Opposed to the simplicity of C18/XC8/SDCC C compilers:
PORTAbits.RA3 = 1; // for GLCD_CSEL1 to be set
PORTAbits.RA4 = 0; // for GLCD_CSEL2 to be clear-ed
Of course, you can write macros to mask that and get close to the features PIC compilers are offering but I always looked over the shoulder in the PIC garden for such a simple pin manipulation.
I don't blame AVRs for this avr-gcc compiler inability, the micros are amazing and I love to use them. And I don't say the compiler is not good in what is doing because it misses this feature - the compiler is also amazing in what it produces for free. It is a fantastic team. I only say that this is scary for a beginner coming from the PIC world.
And if continues to bother you, there are alternatives. For C programmers, the alternatives are not free, CodevisionAVR compiler is an excellent commercial alternative. But if it happens to know other languages, like Pascal and Basic, there is a fantastic free alternative: LunaAVR, a compiler, assembler, disassembler, debugger and a graphical IDE with a lot of useful assisting tools. It provides even object oriented programming if you are into it. And the compilation result is in many cases better than the one in avr-gcc! Go to their site, it is worth a part of your time and I bet you will be content.