optimiert der Compiler so etwas weg?

Gast #3027850
Lesenswert?

Hallo,

ich möchte mein Programm etwas "allgemein und portabel" gestalten. Daher 
möchte ich, je nachdem welche FCPU später verwendet wird, den 
entsprechenden ADC-Vorteiler setzen.

Beispielsmäßig so:
1
#ifndef F_CPU
2
#define F_CPU           16000000UL                   
3
#warning kein F_CPU definiert
4
#endif
5

6
  if (F_CPU == 8000000UL){
7
  ADCSRA = (1<<ADPS2) | (1<<ADPS1);     // Frequenzvorteiler auf 64 einstellen --> 125kHz Abtastrate
8
  }
9
  
10
  
11
  if (F_CPU == 16000000UL){
12
  ADCSRA = (1<<ADPS2) |(1<<ADPS1) | (1<<ADPS0);     // Frequenzvorteiler 128 auf einstellen --> 125kHz Abtastrate
13
  }

Optimiert der Compiler so etwas weg? FCPU ist ja schon zur Compilzeit 
fest und verändert sich während der Laufzeit nicht. Oder wird die 
if-Anweisung tatsächlich während der Laufzeit erst behandelt?

Danke.
Gast #3027926
Lesenswert?

A. K. schrieb:
> Lieber nicht, sonst wirkt man einer sauberen Programmierung entgehen.
> Denn obiger Code ist weit lesbarer, als der Ersatzcode mit
> Präprozessor-#if statt C-if.
>
> GCC liefert daher auch mit -Wall keine Warnung.

Ist ja auch klar. Denn der COde ist erreichbar. Je nach Wert von FCPU. 
Nicht erreichbarer Code ist per Definition Code der niemals erreicht 
werden kann. Also nicht mehr Wert als toter Zeichensalat. Dann, und nur 
dann, schmeißt der GCC eine Warnung, wenn er so eine Codestelle erkannt 
hat.
Gast #3027970
Lesenswert?

A. K. schrieb:
> Ist so ein Code auch erreichbar?
>
> if (0) {
>    g();
> }

Entschuldige bitte, ich war etwas zu schnell mit meinen Gedanken. Du 
hast natürlich Recht. Denn der GCC bekommt das ja mit eingesetzter 
Konstante (nach dem Präprozessor) geliefert. Damit ist das Beispiel mit 
FCPU das gleiche wie if (0) .

Warum gibts denn da keine Warnung vom GCC? ;-)
#3027978
Lesenswert?

Naja in dem Beispiel ist es ganz einfach.
Aus dem Preprozessor kommt

  if (16000000UL == 8000000UL){
  ...
  }

  if (16000000UL == 16000000UL){
  ...
  }

raus, was im nächsten Schritt zu 0 und 1 zusammen gefasst wird, und die 
ifs fliegen raus.

Was anderes wäre es, wenn Du eine globale Variable hast, denn da gibt es 
für den Compiler keine sichere Methode festzustellen, ob die Verändert 
wurde oder nicht. (da gibts aber auch Möglichkeiten dem Compiler zu 
sagen was Du willst)

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