Gibt es const in C?
Diese Frage mag naiv sein, aber:
- ist es
const
- Schlüsselwort in C? - seit welcher version?
- gibt es semantische und/oder syntaktische Unterschiede zwischen
const
in C und C++?
InformationsquelleAutor der Frage Armen Tsirunyan | 2011-03-09
Du musst angemeldet sein, um einen Kommentar abzugeben.
Gibt es keine syntaktischen Unterschiede zwischen C und C++ mit Bezug auf
const
Stichwort, neben einer eher obskuren eins: in C (seit C99) Sie können erklären, Funktion, Parameter wieentspricht
Erklärung. C++ nicht unterstützt diese syntax.
Semantische Unterschiede existieren ebenso. @Ben Voigt bereits erwähnt, in der C
const
Deklarationen erzeugen keine Konstante Ausdrücke, D. H. in C, die Sie nicht verwenden können, eineconst int
Objekt in einemcase
label, als bit-Feld Breite oder als array-Größe, die in einem nicht-VLA array-Deklaration (all dies ist möglich in C++). Auchconst
Objekte haben externe Bindung standardmäßig in C (interne Kopplung in C++).Gibt es mindestens einen semantischen Unterschied, der Ben nicht zu erwähnen. Const-correctness Regeln der Sprache C++ unterstützt die folgenden standard-Konvertierung
Diese Initialisierungen sind illegal in C.
Im Allgemeinen, beim Umgang mit multi-level-Pointer, C++ sagt, dass Sie hinzufügen können, const-qualification in jeder Tiefe der Dereferenzierung, so lange, wie Sie auch hinzufügen, const-Qualifizierung den Weg in die oberste Ebene.
In C Sie können nur const-Qualifizierung auf die Art hingewiesen, die von der top-level-pointer, aber nicht tiefer.
Anderen Ausdruck der gleichen zugrunde liegende Allgemeine Prinzip ist die Art, wie const-correctness-Regeln arbeiten mit arrays in C und C++. In C++ können Sie tun
Versuchen, das gleiche zu tun in C führt zu einem Fehler
InformationsquelleAutor der Antwort AnT
Den ersten beiden Fragen werden hier beantwortet: Const in C
Ja, es gibt schon einige Unterschiede in der Semantik zwischen
const
in C und C++.In C++
const
Variablen des entsprechenden Typs sind Integrale Konstante Ausdrücke und kann verwendet werden, in Zusammenhang, die erfordert werden, dass, wie von array-Grenzen, und in der enum-Definitionen. In C sind Sie nicht und kann nicht sein.In C++
const
Globale Variablen automatischstatic
Verknüpfung, so können Sie setzen Sie Sie in den header-Dateien. In C -, Z-Variablen haben externe Bindung und generieren würden doppelte definition Fehler bei link-Zeit.InformationsquelleAutor der Antwort Ben Voigt
Ja, es ist ein
const
Schlüsselwort. Es wurde Hinzugefügt, als Teil von 1989.Soweit Kompatibilität, hier ist ein Absatz von Harbison & Steele, 5th edition:
InformationsquelleAutor der Antwort John Bode
Zwei andere Unterschiede:
const arraytype
(ich.etypedef int A[1]; const A a = { 0 };
) gibt eine Konstante array-Typ ( http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#112 und http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#1059 ) (und deren Elemente sind so qualifiziert zu) in C++, aber ein non-constant array-Typderen Elemente sind so qualifiziert, C.const const
ist gültig in C99 (gilt nicht in C89), nicht gültig in C++ in jeder version (Sie können nur semantisch wiederholenconst
nicht syntaktisch). It-Verträge zuconst
in C99.InformationsquelleAutor der Antwort Johannes Schaub - litb
Ja,
const
hat es seither mindestens seit ANSI-C (aka C89).Erscheint es sicherlich in meine Kopie von "The C Programming Language (2nd Edition)", Kernighan & Ritchie (veröffentlicht 1988).
Relevante Auszug:
InformationsquelleAutor der Antwort GrahamS
Den sematic in C ist anders als in C++, e.g
in der Datei scope gültig in C++, aber nicht in C.
InformationsquelleAutor der Antwort Jens Gustedt
Ja.
const
ist es in C, von C89.Ist hier gut zu Lesen ist über Verhalten von const-Schlüsselwort in C.
InformationsquelleAutor der Antwort Nawaz
Ja, es gibt eine
const
keyword in C. Es ist dort seit C90.Syntaktisch, es kann auftreten, in den gleichen Orten, wie in C++. Semantisch, es ist ein bisschen mehr strenge, IIRC.
InformationsquelleAutor der Antwort Anthony Williams
Laut ESR
const
wurde Hinzugefügt, in der ANSI-C-Entwurf Vorgeschlagenen Standard. Eric Giguere Zusammenfassung von ANSI-Cdatiert 1987, bestätigt es.EDIT: Ähnlich sieht dies der Entwurf selbst - Suche nach "3.5.3 Type qualifiers".
InformationsquelleAutor der Antwort Ken
Es ist ein "const" - Schlüsselwort in C, und wurde für eine LANGE Zeit. Wenn eine variable benannt wird "const", schreibt er, sind verboten. Darüber hinaus sind in einigen Umgebungen, Variablen, die "const", kann Sie sich in eine andere Daten-segment von anderen Variablen. Diese Daten-segment bieten können hardware-Schreibschutz, und für eingebettete Systeme, die gespeichert werden können im ROM oder flash-Speicher anstatt im RAM (eine sehr wichtige Unterscheidung, die auf einigen Prozessoren, die viel mehr ROM-oder flash als RAM--z.B. 128K flash und 3,5 K RAM, oder 2K-ROM, 96 bytes RAM).
Beachten Sie, dass der compiler in der Regel nichtmachen Sie keine Rückschlüsse über das "const" - Werte oder Ausdrücke mit Ihnen. Wenn ich sage "const char foo[] = "Hallo";" und dann später als Referenz auf foo[1], der compiler geladen, wird der Wert (die wahrscheinlich 'e') aus, wo foo[] gespeichert wird, und verwenden der geladene Wert. Manchmal ist dies sinnvoll erlaubt Werte gepatcht werden im kompilierten code Bild, aber manchmal ist es einfach verschwendet code.
Wenn Sie wollen, definieren Sie eine Nummer, um eine compile-time "substituierbar" konstant, der beste Weg, zumindest für integer-Konstanten, kann die Verwendung von "enum". Zum Beispiel, "enum {woozle=19;}" bewirkt, dass 19 werden ersetzt für "woozle" im gesamten code. Beachten Sie, dass im Gegensatz zu textuellen Ersetzungen; enum-Deklarationen gehorchen richtige Bereichsregeln.
InformationsquelleAutor der Antwort supercat