| 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; | ||
} | } | ||
| − | </ | + | </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 | ||
| − | </ | + | </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) | ||