Oliver S. schrieb:
> avr-gcc ist ein gcc. Also ist das auch definiert.
Der GCC definiert "__GNUC__" aber nicht "GCC". Da es sich um ein 
Compiler-Spezifisches Makro handelt, darf es nicht mit eventuellen 
Bezeichnern im User-Code kollidieren. Stell dir vor jemand hat dieses 
absolut korrekte und standardkonforme C-Programm verfasst:
1  | int main () {
 | 
2  |   int GCC = 42;
  | 
3  |   return 0;
  | 
4  | }
  | 
Wenn der GCC ein Makro namens "GCC" definieren würde, würde dieser 
standarkonforme Code nicht mehr funktionieren, wodurch der GCC nicht 
standardkonform wäre. Daher fängt das Makro mit 2 Unterstrichen an. 
Würde jemand ein Programm dieser Art verfassen:
1  | int main () {
 | 
2  |   int __GNUC__ = 42;
  | 
3  |   return 0;
  | 
4  | }
  | 
funktioniert es vielleicht in manchen Compilern, aber da Bezeichner mit 
2 Unterstrichen im User-Code verboten sind, ist es falsch und nicht 
standard-konform. Daher ist es ok wenn dieses Programm nicht im GCC 
funktioniert, was auch der Fall ist, da der GCC "__GNUC__" definiert.
Also: Kein Compiler wird ein Makro namens "GCC" definieren oder sonst 
irgendein compilerspezifisches Makro ohne 2 Unterstriche oder 
Unterstrich+Großbuchstabe. "__GNUC__" ist das was man will.
Siehe auch hier, es gibt noch ein paar mehr Details zu beachten:
https://sourceforge.net/p/predef/wiki/Compilers/