Qual è la differenza tra il qualificatore const in C e il qualificatore const in C ++?


9

Ho trovato un commento dell'utente R .. :

C e C ++ non sono la stessa lingua. In particolare, C constnon ha nulla a che fare con C ++ const.

So che una differenza tra il constqualificatore in C e il constqualificatore in C ++ è il suo collegamento predefinito.

Un oggetto dichiarato nell'ambito del namespace con constqualificatore in C ++ ha un collegamento interno, mentre in C un oggetto con constqualificatore dichiarato nell'ambito globale (senza avere un staticqualificatore prima const) ha un collegamento esterno.

Ma in che altro modo differiscono entrambi tra i linguaggi di C e C ++? Ho pensato che entrambi abbiano lo stesso tipo di concetto e scopo in entrambe le lingue.

La mia domanda:

  • Qual è la differenza tra il qualificatore const in C e il qualificatore const in C ++?

Le risposte a In che cosa differisce "const" in C e C ++? non indicano una differenza esatta tra le lingue di C e C ++ nel contesto del constqualificatore. Solo ciò che non puoi fare o che puoi fare in una determinata lingua.


Così tante risposte solo una ricerca su Google di distanza. Uno di loro: stackoverflow.com/questions/4486442/...
schaiba

1
In C, constnon ha nulla a che fare con il collegamento. Puoi avere l' static constambito del file e ha un collegamento interno,
Lundin

3
Se non sei soddisfatto delle risposte attuali a quella domanda, che è la stessa della tua, prendi in considerazione di pubblicare una taglia su di essa.
Sneftel

3
Sono d'accordo che il duplicato collegato non è valido. Una buona risposta dovrebbe elencare tutte le differenze e non spiegare tanto cosa constfa lo stesso in entrambe le lingue.
Lundin

1
Posso provare a scrivere una risposta del genere, ma non sono abbastanza un guru del C ++ per essere sicuro di aver coperto tutte le differenze. In cima alla mia testa: le variabili const in C ++ sono espressioni costanti, a differenza di C. C ++ può const qualificare le funzioni membro. Il collegamento citato. Qualunque altra cosa?
Lundin

Risposte:


11
  • La differenza più importante è che in C ++ una constvariabile è un'espressione costante (anche prima dell'introduzione di C ++ 11 constexpr), ma una constvariabile in C non lo è.

    Ciò significa che C ++ ti consente di fare cose del genere const size_t n = 1; static int array[n];ma C non lo consente, presumibilmente per ragioni storiche.

  • In C ++, constpartecipa alla determinazione del collegamento. Questo è diverso tra le versioni C ++. Secondo cppreference.com (sottolineatura mia):

    Uno dei seguenti nomi dichiarati nell'ambito dello spazio dei nomi ha un collegamento interno:


    • non volatile non modello (dal C ++ 14) non in linea (dal C ++ 17) non esportato (dal C ++ 20) variabili qualificate const (incluso constexpr) che non sono dichiarate esternamente e non sono " t precedentemente dichiarato di avere un collegamento esterno;

    Considerando che in C, constnon partecipa affatto alla determinazione del collegamento - contano solo l'ambito della dichiarazione e gli identificatori della classe di memoria.

  • In C ++, è possibile constqualificare le funzioni membro. Questo non è possibile in C poiché non ha il supporto di sintassi per le funzioni membro.

  • C consente di constdichiarare variabili qualificate senza un inizializzatore. In C, possiamo scrivere const int x;senza inizializzatori, ma C ++ non lo consente. A prima vista, questo può sembrare un insensato errore di linguaggio in C, ma la logica è che i computer hanno registri hardware di sola lettura con valori impostati dall'hardware, non dal software. Ciò significa che C rimane adatto per la programmazione relativa all'hardware.


Puoi avere funzioni membro in C?
Maxim Egorushkin,

1
Nota che const size_t n = 1; static int array[n];funziona solo se il compilatore può vedere la definizione ne fare una propagazione costante. extern const size_t n; static int array[n];non funziona
Maxim Egorushkin,

Preferisco vedere questi registri di hard ware indirizzati tramite puntatori, come uint32_t const* x = reinterpret_cast<uint32_t const*>(20102012);...
Aconcagua,

@Aconcagua Ciò renderebbe tali registri incompatibili con il resto della mappa dei registri. E come ti consentirebbe di visualizzare i valori di registro effettivi in ​​un debugger? Ad esempio, se si desidera solo visualizzare i registri dei set di maschere in silicone di sola lettura per vedere rapidamente con quale parte si è finito. E ovviamente, dovresti anche volatilequalificare il puntatore.
Lundin

@Lundin Ammesso, non ho prestato attenzione al volatile... Il resto dipende. Anche i debugger che avevo in mano in questi casi potevano facilmente risolversi *x. D'altra parte, se i registri sono mappati su un'area di memoria e il compilatore non supporta il posizionamento diretto di variabili in specifiche posizioni di memoria (le ho viste entrambe), ottenere la variabile in una specifica posizione di memoria a volte può diventare un po 'confuso (doverlo coprire nel file della mappa ...). Alla fine non mi interessa molto avere una variabile posizionata nel posto giusto o un puntatore, purché riesca a ottenere il compito che mi viene assegnato;)
Aconcagua

0

Da cppreference.com :

Il constqualificatore utilizzato su una dichiarazione di una variabile non locale non volatile non modello (dal C ++ 14) non in linea (dal C ++ 17) che non è dichiarata externfornisce un collegamento interno. Questo è diverso da C dove constle variabili dell'ambito del file hanno un collegamento esterno.

A parte questo, constla stessa semantica nelle intestazioni C e C ++ e C constviene spesso compilata come intestazioni C ++ con condizioni "extern C".


1
È una brutta citazione, semplificazione eccessiva. static const x;nell'ambito del file in C ha un collegamento interno. Il collegamento di una variabile C è determinato dall'ambito in cui è dichiarato, nonché dalla presenza / assenza degli identificatori della classe di archiviazione. conste altri tipi di qualificatori non ne giocano affatto.
Lundin

@Lundin In che cosa differisce da quello che dice la citazione?
Maxim Egorushkin,

1
L'esempio che ho appena dato dimostra che la citazione è sbagliata. Secondo la citazione, static const x;nell'ambito del file in C ha un collegamento esterno.
Lundin

@Lundin La citazione dice che int const x = 1in C ha un collegamento esterno . Quindi, dovresti staticcambiare il collegamento in interno. La citazione è abbastanza chiara per me, a differenza dei tuoi commenti.
Maxim Egorushkin,

1
Davvero non lo dice affatto. Leggi la citazione "... C dove le variabili dell'ambito del file const hanno un collegamento esterno".
Lundin
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.