Was ist der Unterschied zwischen dem const-Qualifizierer in C und dem const-Qualifizierer in C ++?

9

Ich habe einen Kommentar von Benutzer R gefunden .. :

C und C ++ sind nicht dieselbe Sprache. Insbesondere hat C constnichts mit C ++ zu tun const.

Ich weiß, dass ein Unterschied zwischen dem constQualifizierer in C und dem constQualifizierer in C ++ die Standardverknüpfung ist.

Ein im Namespace-Bereich mit constQualifizierer in C ++ deklariertes Objekt verfügt über eine interne Verknüpfung, während in C ein Objekt mit einem constim globalen Bereich deklarierten Qualifizierer (ohne vorher einen staticQualifizierer 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.

RobertS unterstützt Monica Cellio
quelle
So viele Antworten nur eine Google-Suche entfernt. Eine davon: stackoverflow.com/questions/4486442/…
schaiba
1
In C consthat nichts mit Verknüpfung zu tun. Sie können static constam Dateibereich haben und es hat interne Verknüpfung,
Lundin
3
Wenn Sie mit den aktuellen Antworten auf diese Frage nicht zufrieden sind - die mit Ihrer identisch ist -, sollten Sie eine Prämie dafür in Betracht ziehen.
Sneftel
3
Ich bin damit einverstanden, dass das verknüpfte Duplikat schlecht ist. Eine gute Antwort würde alle Unterschiede auflisten und nicht so sehr erklären, was constin beiden Sprachen dasselbe bewirkt.
Lundin
1
Ich kann versuchen, eine solche Antwort zu schreiben, aber ich bin nicht genug von einem C ++ - Guru, um sicher zu sein, dass ich alle Unterschiede abgedeckt habe. Ganz oben auf meinem Kopf: const-Variablen in C ++ sind konstante Ausdrücke, anders als in C. C ++ kann Mitgliedsfunktionen const qualifizieren. Die erwähnte Verknüpfung. Noch etwas?
Lundin

Antworten:

11
  • Der wichtigste Unterschied besteht darin, dass in C ++ eine constVariable ein konstanter Ausdruck ist (auch vor der Einführung von C ++ 11 constexpr), eine constVariable 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.

  • constSpielt in C ++ eine Rolle bei der Bestimmung der Verknüpfung. Dies unterscheidet sich zwischen C ++ - Versionen. Laut cppreference.com (Schwerpunkt Mine):

    Alle im Namespace-Bereich deklarierten Namen sind intern verknüpft:


    • nichtflüchtig nicht vorlagen (seit C ++ 14) nicht inline (seit C ++ 17) nicht exportiert (seit C ++ 20) const-qualifizierte Variablen (einschließlich constexpr), die nicht extern und aren deklariert sind ' t zuvor als extern verknüpft deklariert;

    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 constqualifizieren. Dies ist in C nicht möglich, da es keine Syntaxunterstützung für Elementfunktionen bietet.

  • Mit C können constqualifizierte Variablen ohne Initialisierer deklariert werden. In C können wir const 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.

Lundin
quelle
Können Sie Mitgliedsfunktionen in C haben?
Maxim Egorushkin
1
Beachten Sie, dass dies const size_t n = 1; static int array[n];nur funktioniert, wenn der Compiler die Definition der nkonstanten Weitergabe sehen und diese ausführen kann. extern const size_t n; static int array[n];funktioniert nicht
Maxim Egorushkin
Hm, ich sehe eher, dass solche Hardwareregister über Zeiger adressiert werden, wie uint32_t const* x = reinterpret_cast<uint32_t const*>(20102012);...
Aconcagua
@Aconcagua Das würde solche Register mit dem Rest der Registerkarte inkompatibel machen. Und wie können Sie so die tatsächlichen Registerwerte in einem Debugger anzeigen? Wenn Sie beispielsweise nur die schreibgeschützten Register der Siliziummasken anzeigen möchten, um schnell zu sehen, mit welchem ​​Teil Sie am Ende fertig sind. Und natürlich müssten Sie auch volatileden Zeiger qualifizieren.
Lundin
@Lundin Zugegeben, habe nicht auf die volatile... Rest hängt davon ab. Die Debugger, die ich in diesen Fällen von Hand hatte, konnten ebenfalls leicht behoben *xwerden. 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;)
Aconcagua
0

Von cppreference.com :

Das constQualifikationsmerkmal, das für eine Deklaration einer nicht lokalen nichtflüchtigen Nicht-Inline-Variablen (seit C ++ 14) (seit C ++ 17) verwendet wird, die nicht deklariert ist, externgibt ihr eine interne Verknüpfung. Dies unterscheidet sich von C, wo constDateibereichsvariablen eine externe Verknüpfung haben.

Ansonsten consthat die gleiche Semantik in C und C ++ und C-Header mit constwerden häufig als C ++ - Header mit Bedingung kompiliert "extern C".

Maxim Egorushkin
quelle
1
Es ist ein schlechtes Zitat, eine Vereinfachung. 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. constund andere Typqualifizierer spielen überhaupt keine Rolle.
Lundin
@Lundin Wie unterscheidet sich das von dem, was das Zitat sagt?
Maxim Egorushkin
1
Das Beispiel, das ich gerade gegeben habe, beweist, dass das Zitat falsch ist. Laut dem Zitat hat static const x;der Dateibereich in C eine externe Verknüpfung.
Lundin
@Lundin Das Zitat besagt, dass int const x = 1in C eine externe Verknüpfung besteht . Daher müssten Sie staticdie Verknüpfung in intern ändern. Das Zitat ist mir im Gegensatz zu Ihren Kommentaren ziemlich klar.
Maxim Egorushkin
1
Das sagt es wirklich überhaupt nicht. Lesen Sie das Zitat. "... C wobei const-Bereichsvariablen eine externe Verknüpfung haben".
Lundin