Es gibt einige Situationen, in denen Laufzeit-Konstanten einfach nicht genügen und Kompilierzeit-Konstanten erforderlich sind. Man kann sich jede Menge Ärger ersparen, wenn man sich dieser Situationen bewusst ist. Selbst wenn eine Variable als Konstante bezeichnet wird: Wird sie nur zur Laufzeit initialisiert, kann sie nicht eingesetzt werden für
- Arraygrenzen
- Case-Ausdrücke
- Länge von Bitfeldern
- Zähler-Initialisierung
- ganzzahlige oder aufzählende non-type-Template-Argumente
In Tabelle A wird jeweils ein Beispiel gezeigt.
Tabelle A |
|
Kompilierzeit |
Laufzeit (generiert Fehler bei Kompilierung) |
Arraygrenzen |
const int MAX=5; int a[MAX]; |
#include // liest eine Ganzzahl zur Laufzeit ein int read_at_runtime() {int n=0; std::cin>>n; return n;}
const int MAX=read_at_runtime(); int a[MAX]; int main() {} |
Case-Ausdrücke |
const int MAX=5
int i=read_at_runtime(); switch(i) { case MAX: std::cout<<"read max."<break; default: std::cout<<"read"<break; } |
// read_at_runtime – wie vorher const int MAX=read_at_runtime(); switch(i) { case MAX: std::cout<<"read max."<default: std::cout<<"read"<} |
Länge von Bitfeldern |
const int MAX=5; struct example { const int bitlength:MAX; }; |
// read_at_runtime – wie vorher const int MAX=read_at_runtime(); struct example { const int bitlength:MAX; }; |
Zähler-Initialisierung |
const int MAX=0; typedef enum DoTimes { None=MAX Once=1, Multiple=2, }; |
// read_at_runtime – wie vorher const int MAX=read_at_runtime();
typedef enum DoTimes { None=MAX, Once=1, Multiple=2, }; |
Ganzzahlige oder aufzählende non-type-Template-Argumente |
const int MAX=5;
template class test {};
int main() {testval;} |
// read_at_runtime – wie vorher const int MAX=read_at_runtime();
template class test {};
int main() {testval;} |
|
Zu beachten ist außerdem, dass manche Optimierungen nicht ausgeführt werden, wenn eine Kompilierzeit-Konstante in eine Laufzeit-Konstante umgewandelt wird, wie Listing B zeigt.
Neueste Kommentare
Noch keine Kommentare zu Umwandlung von Kompilierzeit-Konstanten zu Laufzeit-Konstanten und umgekehrt
Kommentar hinzufügenVielen Dank für Ihren Kommentar.
Ihr Kommentar wurde gespeichert und wartet auf Moderation.