Wer rechnet #define aus?

OP #3421192
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)
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.
be stucki schrieb:
> Was aber nicht bedeutet, dass der Präprozessor nicht rechnen kann, denn
> folgender Code wird einen Fehler produzieren:

Korrekt. Aber die Bedingung eines #(els)if Statements ist die einzige 
Stelle, an der der Präprozessor rechnet. Sehe viele Anfänger gehen 
jedoch davon aus, dass er auch in #define rechnet. Und das tut er nicht.
OP
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
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.
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

Eine eigene Frage? Dieser Thread ist über 12 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

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.