C — Änderungen 11485 → 11486

Zeile 24: Zeile 24:
 
=== ''volatile'' ===
 
=== ''volatile'' ===
 
''volatile'' ist ein ''type-qualifier'' in C. Falls ein Typ T ''volatile''-qualifiziert ist, dann bedeutet das, dass sich der Wert einer Variable vom Typ T durch Instruktionen, die außerhalb der momentanen Befehlssequenz stehen (z.B. in einem [[Interrupt]]handler), verändern kann. Dazu folgender Beispielcode:
 
''volatile'' ist ein ''type-qualifier'' in C. Falls ein Typ T ''volatile''-qualifiziert ist, dann bedeutet das, dass sich der Wert einer Variable vom Typ T durch Instruktionen, die außerhalb der momentanen Befehlssequenz stehen (z.B. in einem [[Interrupt]]handler), verändern kann. Dazu folgender Beispielcode:
−
<c>
+
<syntaxhighlight lang=c>
 
// 1 falls next_char ein gültiges Zeichen enthält, 0 sonst
 
// 1 falls next_char ein gültiges Zeichen enthält, 0 sonst
 
int char_valid;
 
int char_valid;
Zeile 40: Zeile 40:
 
   return next_char;
 
   return next_char;
 
}
 
}
−
</c>
+
</syntaxhighlight>
 
Die Variable ''char_valid'' und ''next_char'' sollen außerdem in einem Interrupthandler entsprechend gesetzt werden. Bei dem obigen Code kann es nun sein, dass der Compiler "optimiert" hat, indem die while-Schleife wie folgt abgeändert wird:
 
Die Variable ''char_valid'' und ''next_char'' sollen außerdem in einem Interrupthandler entsprechend gesetzt werden. Bei dem obigen Code kann es nun sein, dass der Compiler "optimiert" hat, indem die while-Schleife wie folgt abgeändert wird:
−
<c>
+
<syntaxhighlight lang=c>
 
if (char_valid == 0)
 
if (char_valid == 0)
 
   while (1); // Endlosschleife
 
   while (1); // Endlosschleife
−
</c>
+
</syntaxhighlight>
 
Dies ist eine korrekte Optimierung da der Compiler bei ''char_valid'' - da es nicht ''volatile''-qualifiziert ist - annehmen darf, dass es nicht durch den Interrupthandler (oder irgendwelchen Code der nicht in get_char steht) verändert werden kann. Insofern reicht es aus einmal ''char_valid'' zu lesen. Mit dieser "Optimierung" liefert der Code natürlich nichtmehr das gewünschte Resultat. Um das zu korrigieren muss ''char_valid'' und ''next_char'' ''volatile''-qualifiziert werden.
 
Dies ist eine korrekte Optimierung da der Compiler bei ''char_valid'' - da es nicht ''volatile''-qualifiziert ist - annehmen darf, dass es nicht durch den Interrupthandler (oder irgendwelchen Code der nicht in get_char steht) verändert werden kann. Insofern reicht es aus einmal ''char_valid'' zu lesen. Mit dieser "Optimierung" liefert der Code natürlich nichtmehr das gewünschte Resultat. Um das zu korrigieren muss ''char_valid'' und ''next_char'' ''volatile''-qualifiziert werden.
  
Zeile 52: Zeile 52:
 
== Bekannte C-Compiler ==
 
== Bekannte C-Compiler ==
 
* gcc aus der [[GNU Compiler Collection]]
 
* gcc aus der [[GNU Compiler Collection]]
 +
* [[Clang]] aus dem LLVM Projekt
 
* [http://bellard.org/tcc/ tcc] (Tiny C Compiler)
 
* [http://bellard.org/tcc/ tcc] (Tiny C Compiler)
 
* [http://dir.filewatcher.com/d/FreeBSD/4.2-release/i386/bcc-1995.03.12.tgz.79915.html bcc] ein 16Bit Compiler für Linux (im dev86-Paket enthalten)
 
* [http://dir.filewatcher.com/d/FreeBSD/4.2-release/i386/bcc-1995.03.12.tgz.79915.html bcc] ein 16Bit Compiler für Linux (im dev86-Paket enthalten)