Welche Berechnungen erfolgen durch Präprozessor ?

Gast #5761093
Lesenswert?

Hallo,

gegeben sind drei Binärwerte

z.B. so:
1
#define IO_BIT_OQ 0b00000001
2
#define IO_BIT_OB 0b00000010 
3
#define IO_BIT_OD 0b00000100
4

5
void setup() {
6
  byte iBitmaske = IO_BIT_OQ | IO_BIT_OB | IO_BIT_OD;
7
}

Jetzt stellt sich mir die Frage, ob der Ausdruck "byte iBitmaske = 
IO_BIT_OQ | IO_BIT_OB | IO_BIT_OD;" vom Präprosessor vor-berechnet wird, 
oder ob der Compiler das 1:1 ins Programm übernimmt.

Ja, muss mir demn. mal Gedanken machen, in welcher Datei ich den 
compilierten Code vorfinde. Dann kann ich selbst nachsehen und muss euch 
nicht auf den S* gehen mit so bl. Fragen.  ;)
Gast #5761115
Lesenswert?

M.A. S. schrieb:

> In der Regel kann man C-Compiler (darum geht es hier doch wohl?) dazu
> bringen, den C-Quellcode in Assembler-Quellcode zu übersetzen.
> In diesem kannst Du dann nachschauen, was im Detail entstanden ist.

Jepp, das wäre schick. Hast du eine kurze Info parat, wie das geht?

M.A. S. schrieb:
> Der Compiler berechnet zur Compilierzeit Dinge, wenn er kann.

Ja gut, dann halt der Compiler.

Harry L. schrieb:
> Der Precompiler macht nur Text-Ersetzungen.
> Das sollte deine Frage beantworten.

Leider noch nicht ganz.

Gut, dann so gefragt: Wird der Ausdruck als ein Wert compiliert (also 
im Endeffekt "byte iBitmaske = 0b00000111), oder bleibt die 
OR-Verknüpfung im Programm?
Gast #5761126
Lesenswert?

> Jepp, das wäre schick. Hast du eine kurze Info parat, wie das geht?

Bei gcc-Aufruf das -c durch ein -S ersetzen - dann wird statt des 
.o-File ein .s-File mit dem Assemblercode erzeugt.

> Gut, dann so gefragt: Wird der Ausdruck als ein Wert compiliert (also
> im Endeffekt "byte iBitmaske = 0b00000111), oder bleibt die
> OR-Verknüpfung im Programm?

Der Vorgang nennt sich Constant Folding und wird selbst bei -O0 
durchgeführt.

https://en.wikipedia.org/wiki/Constant_folding
#5761138
Lesenswert?

zitter_ned_aso schrieb:
> Jörg W. schrieb:
>> In bedingten Ausdrücken
>
>  macht er dann auch irgendwelche Test (Kompatibilität der Datentypen,
> etc.)?

Ob die Datentypen korrekt sind wird schon geprüft, ansonsten aber nicht 
besonders viel (Teilen durch 0 wird noch abgefangen).
1
#define HALLO "Hallo"
2
#if HALLO > 0 
3
#endif

Führt z.B. zu
1
<source>:2:5: error: token ""Hallo"" is not valid in preprocessor expressions

Was man dabei allerdings beachten muss, ist dass undefinierte Makros zu 
0 ausgewertet werden.
Gast #5761145
Lesenswert?

M.A. S. schrieb:
> In der Regel kann man C-Compiler (darum geht es hier doch wohl?) dazu
> bringen, den C-Quellcode in Assembler-Quellcode zu übersetzen.
> In diesem kannst Du dann nachschauen, was im Detail entstanden ist.

Es geht noch besser: Man kann sich auch die Ausgabe des Präprozessors 
anschauen, die der C-Compiler compiliert.

Dazu dient die gcc Option -E.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren