Nabend und frohes Jahr 2003!
Langsam fängt es mich an zu stören dass der GCC keine Zahlen in
Binärschreibweise unterstützt...
Ich habe mir, wie viele andere wohl auch, per
#define b00000000 0
#define b00000001 1
#define b00000010 2
#define b00000011 3
[...]
abhilfe geschaffen, lieber währe es mir jedoch wenn der Syntax der selbe
währe wie bei den Hex-Zahlen: z.B.: 0b00000010
Ich kenne mich mit den Compiler selber nicht so gut aus, aber vielleicht
kann man ihm das in irgendeiner File begreiflich machen?! Per #define
geht es ja leider nicht, wegen der führenden "0"..
Da gab es auch mal etwas mit einem Bitfeld in Kombination mit einem
Makro.
Aber so richtig begeistern kann dies alles nicht. Eigentlich schade.
Gibt es hier wirklich keine elegantere Lösung?
Notker
Hallo Notker,
ist alles reine Gewöhnungssache, ich komme mit meinem Macro ganz gut
zurecht.
Wenn Du unbedingt Deine eigenen Syntaxregeln aufstellen willst, must Du
eben den C-Compiler selber schreiben.
Jede Sprache hat nun mal ihre Unterschiede und die muß man lernen.
Peter
Interessant fände ich zuweilen 0b als Prefix auch, andere Compiler
können wohl sowas, und es scheint auch dem Standard nicht komplett
zu widersprechen, das als Erweiterung zu haben.
Ändern müßte man die Funktion cpp_classify_number() in der Datei
cppexp.c, falls das jemand mal tun will... ;-)
Das mit 0b wäre schon nett, aber wenn es dann irgendwann Programme gibt
die sich nur noch mit gepatchten GCCs kompilieren lassen kann das ja
auch nicht Sinn der Sache sein... oder wie stehen die Chancen dass man
sowas in den offiziellen GCC aufnehmen würde?
Freunde von Monster-Makros können sich hiermit behelfen (bei Bedarf
verlängern):
#define BIN(x) \
((x%10)\
|(((x/10)%10)<<1)\
|(((x/100)%10)<<2)\
|(((x/1000)%10)<<3)\
|(((x/10000)%10)<<4)\
|(((x/100000)%10)<<5)\
|(((x/1000000)%10)<<6)\
|(((x/10000000)%10)<<7)\
)
Ob nun "mitdenkendes" Makro oder die Liste von defines... Das ist Jacke
wie Hose.
Nicht dass es ja garnicht geht, mir geht es halt nur um den letzten
Schliff, das "0b" davor. Wenn man für den PC programmiert ist es relativ
trivial, da man es eigentlich niemals braucht... aber bei den
Mikrocontrollern sieht es da ja grundlegend anders aus...
Hi Andreas,
super Macro, werde ich gleich in meine common.h kopieren !
Vielleicht auch eine Version geteilt in 2 Vierergruppen, damit sichs
besser lesen läßt.
Peter
Wenn schon mit 0b, dann nur so, daß es auch im offiziellen gcc drin
ist, alles andere wäre in der Tat Unsinn.
Ob die gcc-Entwickler sowas akzeptieren würden, weiß ich nicht, aber
sie waren in der Vergangenheit großzügig mit eigenen Erweiterungen,
die über den Standard hinausgehen, insofern kann ich mir das schon
vorstellen (zumal es ja Präzedenzfälle gibt, irgendein Intel-Compiler
glaub ich).
Naja, das problem ist mir noch nicht so einsichtig. man kann binär->hex
doch relativ schnell im kopf rechnen. besonders, wenn man das andauernd
braucht sollte sich das doch schnell üben.
cpp_classify_number() gibt's in gcc 3.2 nicht, die relevanten Stellen
sind lex_number() (Zeile 880) in c-lex.c und parse_number() (Zeile 116)
in cppexp.c.
Der Patch für's 0b-Prefix ist im Anhang (gcc 3.2).
Da gcc 3.2 sowieso die aktuelle Version von avr-libc nicht mehr
unterstützt, was willst Du ihn da erst noch patchen?
Im übrigen sollte wohl auch die Ausschrift "illegal digit in octal
number" (oder so ähnlich) noch angepaßt werden. ;-)
Gedanklich war ich in den 3.3er Quellen auch schon so weit
vorgedrungen, ich hatte es nur noch nicht ausprobiert.
Irgendwo müßte man natürlich dann auch noch die Doku updaten, bevor
man das zu GNU schicken kann.