Wer rechnet #define aus?

OP #3421192
Lesenswert?
• ▲
▼
Was pasiert hier?
Die Buffer größe wird vom Preprozessor ermittelt und mit 3 
multipliziert?
Am ende habe ich in FLASH_CB den wert stehen.

#define FLASH_CB           (sizeof(BUFFER) * 3)


hier wird einfach nur im späteren code meinPORT ebend durch PORTD 
ersetzt

#define meinPORT  PORTD;


Und nun die Frage; was passiert hier?
Rechnet der Preprozessor das aus?

#define  FLASH_CB_NUM_32K_BLOCKS        (FLASH_SIZE_CB / 32)
#3421631
Lesenswert?
• ▲
▼
A. K. schrieb:
> Ingo schrieb:
>> David Mueller schrieb:
>>> Rechnet der Preprozessor das aus?
>> Ja
> Nein.

Was aber nicht bedeutet, dass der Präprozessor nicht rechnen kann, denn 
folgender Code wird einen Fehler produzieren:
1
#define VALUE_A 1000
2
#define RESULT (VALUE_A/5)
3

4
#if RESULT>100
5
  #error RESULT ist zu gross
6
#endif

Steht RESULT irgendwo im Code, rechnet das natürlich der Compiler aus.
OP #3423458
Lesenswert?
• ▲
▼
eeeh OK, vielen Dank für die Tips.
Wenn es der compiler rechnet...

Erreicht werden soll das der compiler das rechnet
und nicht die MCU zur laufzeit.

Wie kann man das im code klar machen das es wirklich der 
preprozessor/compiler macht?
1
void rechne(void) {
2
 BYTE x;
3
 x = 10 + 2;
4
}
5

6
void rechne(void) {
7
 const BYTE x = 10;
8
 x += 2;
9
}
10

11
// Wie ist es hier? Rechnet das der Compiler vorher?
12
#define y 10
13

14
void rechne(void) {
15
 x = y + 2;
16
}
Moderator Persönliche Seite #3423616
Lesenswert?
• ▲
▼
David Mueller schrieb:
> Wie kann man das im code klar machen das es wirklich der
> preprozessor/compiler macht?

Gar nicht.

Das ist immer eine Entscheidung des Compilers.

Du kannst aber getrost davon ausgehen, dass er Ausdrücke, die ganz
eindeutig zur Compilezeit bekannt (und konstant) sind, auch da bereits
ausrechnet, sofern du mindestens mit -O1 compilierst.
Persönliche Seite #3423661
Lesenswert?
• ▲
▼
Jörg Wunsch schrieb:
> Stefan Ernst schrieb:
>> Nur so als Info: Constant-Folding wird auch schon bei -O0 gemacht.
>
> Teils, teils.  Die Gleitkommaargumente von _delay_ms() etc. werden
> halt bei -O0 nicht zur Compilezeit aufgelöst,

Dabei handelt es sich aber nicht um ein reines Constant-Folding, es sind 
z.B. noch (inline) Funktionen zwischengeschaltet.
#3423688
Lesenswert?
• ▲
▼
Eine garantierte Auswertung zur Compile-time gibt es seit C++11 (avr-gcc 
ab Version 4.8) mit dem 'constexpr'-Konstrukt.
Siehe z.Bsp. hier:
http://www.cprogramming.com/c++11/c++11-compile-time-processing-with-constexpr.html

Damit kann man nun erstmals auf Preprozessor-Makros verzichten!

Anmerkung: Man muss deswegen jedoch nicht alles auf C++11 umzustellen. 
Für die allermeisten Fälle sind die C-Compiler klug genug.

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.