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/