Ich habe einen Kommentar von Benutzer R gefunden .. :
C und C ++ sind nicht dieselbe Sprache. Insbesondere hat C
const
nichts mit C ++ zu tunconst
.
Ich weiß, dass ein Unterschied zwischen dem const
Qualifizierer in C und dem const
Qualifizierer in C ++ die Standardverknüpfung ist.
Ein im Namespace-Bereich mit const
Qualifizierer in C ++ deklariertes Objekt verfügt über eine interne Verknüpfung, während in C ein Objekt mit einem const
im globalen Bereich deklarierten Qualifizierer (ohne vorher einen static
Qualifizierer const
) über eine externe Verknüpfung verfügt.
Aber wie unterscheiden sich beide zwischen den Sprachen C und C ++? Ich habe gedacht, beide haben in beiden Sprachen das gleiche Konzept und den gleichen Zweck.
Meine Frage:
- Was ist der Unterschied zwischen dem const-Qualifizierer in C und dem const-Qualifizierer in C ++?
Die Antworten auf Wie unterscheidet sich "const" in C und C ++? Zeigen Sie im Kontext des Qualifizierers keinen genauen Unterschied zwischen den Sprachen C und C ++ an const
. Nur was man in einer bestimmten Sprache nicht kann oder kann.
quelle
const
hat nichts mit Verknüpfung zu tun. Sie könnenstatic const
am Dateibereich haben und es hat interne Verknüpfung,const
in beiden Sprachen dasselbe bewirkt.Antworten:
Der wichtigste Unterschied besteht darin, dass in C ++ eine
const
Variable ein konstanter Ausdruck ist (auch vor der Einführung von C ++ 11constexpr
), eineconst
Variable in C jedoch nicht.Das bedeutet, dass Sie mit C ++ Dinge wie tun können,
const size_t n = 1; static int array[n];
aber C erlaubt dies angeblich aus historischen Gründen nicht.const
Spielt in C ++ eine Rolle bei der Bestimmung der Verknüpfung. Dies unterscheidet sich zwischen C ++ - Versionen. Laut cppreference.com (Schwerpunkt Mine):Während in C
const
überhaupt keine Rolle bei der Bestimmung der Verknüpfung spielt, sind nur der Deklarationsumfang und die Speicherklassenspezifizierer von Bedeutung.In C ++ können Sie Elementfunktionen
const
qualifizieren. Dies ist in C nicht möglich, da es keine Syntaxunterstützung für Elementfunktionen bietet.Mit C können
const
qualifizierte Variablen ohne Initialisierer deklariert werden. In C können wirconst int x;
ohne Initialisierer schreiben , aber C ++ erlaubt das nicht. Auf den ersten Blick mag dies wie ein sinnloser Sprachfehler in C erscheinen, aber der Grund dafür ist, dass Computer schreibgeschützte Hardwareregister mit Werten haben, die von der Hardware und nicht von der Software festgelegt werden. Dies bedeutet, dass C für die hardwarebezogene Programmierung geeignet bleibt.quelle
const size_t n = 1; static int array[n];
nur funktioniert, wenn der Compiler die Definition dern
konstanten Weitergabe sehen und diese ausführen kann.extern const size_t n; static int array[n];
funktioniert nichtuint32_t const* x = reinterpret_cast<uint32_t const*>(20102012);
...volatile
den Zeiger qualifizieren.volatile
... Rest hängt davon ab. Die Debugger, die ich in diesen Fällen von Hand hatte, konnten ebenfalls leicht behoben*x
werden. Wenn andererseits die Register einem bestimmten Speicherbereich zugeordnet sind und der Compiler das direkte Platzieren von Variablen an bestimmten Speicherorten nicht unterstützt (ich habe beide gesehen), kann es manchmal etwas chaotisch werden, die Variable an einem bestimmten Speicherort abzurufen (muss das in der Kartendatei abdecken ...). Am Ende ist es mir egal, ob sich eine Variable an der richtigen Stelle befindet oder ein Zeiger, solange ich die Aufgabe erledigen kann, die mir zugewiesen wurde;)Von cppreference.com :
Ansonsten
const
hat die gleiche Semantik in C und C ++ und C-Header mitconst
werden häufig als C ++ - Header mit Bedingung kompiliert"extern C"
.quelle
static const x;
am Dateibereich in C hat interne Verknüpfung. Die Verknüpfung einer C-Variablen wird durch den Bereich bestimmt, in dem sie deklariert ist, sowie durch das Vorhandensein / Fehlen von Speicherklassenspezifizierern.const
und andere Typqualifizierer spielen überhaupt keine Rolle.static const x;
der Dateibereich in C eine externe Verknüpfung.int const x = 1
in C eine externe Verknüpfung besteht . Daher müssten Siestatic
die Verknüpfung in intern ändern. Das Zitat ist mir im Gegensatz zu Ihren Kommentaren ziemlich klar.