Warum impliziert const eine interne Verknüpfung in C ++, wenn dies in C nicht der Fall ist?

82

Siehe Betreff. Was dachten sie?

UPDATE: Von "statisch" zu "interne Verknüpfung" geändert, um Verwirrung zu vermeiden.

Um ein Beispiel zu geben ... Fügen Sie Folgendes in eine Datei ein:

const int var_a = 1;
int var_b = 1;

... und g++ -c test.cppnur mit Exporten kompilieren var_b.

Johan Kotlinski
quelle

Antworten:

111

Ich glaube du meinst

Warum impliziert const eine interne Verknüpfung in C ++?

Wenn Sie ein const-Objekt im Namespace-Bereich deklarieren, verfügt es zwar über eine interne Verknüpfung.

Anhang C ( C ++ 11, C.1.2 ) gibt die Begründung

Änderung: Ein Name des Dateibereichs, der explizit als const und nicht explizit als extern deklariert ist, hat eine interne Verknüpfung, während er in C eine externe Verknüpfung hätte

Begründung: Da const-Objekte in C ++ als Werte zur Kompilierungszeit verwendet werden können, fordert diese Funktion Programmierer auf, explizite Initialisierungswerte für jede const anzugeben. Mit dieser Funktion kann der Benutzer const-Objekte in Header-Dateien einfügen, die in vielen Kompilierungseinheiten enthalten sind.

Johannes Schaub - litb
quelle
Es scheint, dass nicht konstante globale Objekte auch initialisiert werden können, aber warum gibt Standard keine interne Verknüpfung?
Yong Li
13

Wie bereits erwähnt, sind constObjekte in C ++ intern verknüpft. Dies liegt daran, dass sie wie folgt verwendet werden sollen:

// a.cpp
const int BUFSIZE = 100;
char abuf[BUFSIZE];

// b.cpp
const int BUFSIZE = 256
int bbuf[BUFSIZE];
RobertS unterstützt Monica Cellio
quelle
6

Const und Static sind orthogonale Konzepte in C und C ++.

Das constSchlüsselwort weist den Compiler an, zu verhindern, dass die Variable als Wert eines Ausdrucks angezeigt wird, sodass sie im Wesentlichen schreibgeschützt ist.

In C hat das staticSchlüsselwort je nach Anwendung mehrere Verwendungszwecke. Wenn es auf eine Variable einer Funktion angewendet wird, bedeutet dies, dass die Variable nicht im lokalen Bereich einer Funktion gespeichert ist, sondern über Aufrufe derselben zugänglich ist. Wenn es auf eine globale Variable oder Funktion angewendet wird, ist es nur für eine bestimmte Datei zugänglich - mit anderen Worten, es ist nur innerhalb der Kompilierungseinheit zugänglich (sofern nicht deklariert extern).

In C ++, das statickann Schlüsselwort innerhalb einer Klassendefinition verwendet werden, eine Variable oder Funktionen zu machen , geteilt in allen Instanzen der Klasse, anstatt für jede Instanz lokal zu sein. Darüber hinaus kann eine statische Klassenfunktion in C ++ nur auf statische Variablen dieser Klasse (oder auf Klassen, auf die sie Zugriff hat) zugreifen. In C ++ werden constMitglieder nun intern mit der Kompilierungseinheit verknüpft, sofern sie nicht ausdrücklich deklariert sind. externDies ist möglicherweise das, worauf Sie verweisen. Auf diese Weise können Konstanten zur Kompilierungszeit mithilfe von Header-Dateien geräteübergreifend gemeinsam genutzt werden. Beachten Sie jedoch, dass die Mitglieder nicht wirklich statisch sind - vielmehr wird die Konstante an jedem Ort kompiliert, an dem sie referenziert wird.

LBushkin
quelle
6

In C & C ++ hat der Begriff statisch mehrere Bedeutungen (er kann die Verknüpfung und Speicherung regeln). Sie müssen Stroustrups D & E lesen, um seine Begründung zu verstehen. Wenn Sie jedoch eine Variable im Namespace-Bereich als const deklarieren, hat sie automatisch eine interne Verknüpfung In C müssen Sie es als statisch deklarieren, um eine interne Verknüpfung zu erzwingen.

Natürlich ist in C ++ die Verwendung von Static zur Steuerung der Verknüpfung veraltet. Anonyme Namespaces können zur Simulation der internen Verknüpfung in C ++ verwendet werden.

const-Variablen in C ++ sollten Präprozessorkonstanten ersetzen - und da Präprozessorkonstanten nur in Dateien sichtbar sind, die sie definieren, macht const die Variable automatisch nur in der Datei sichtbar, die sie definiert.

Faisal Vali
quelle
4

Diese Konzepte sind orthogonal und sollten nicht als dasselbe gedacht werden.

Konstanz ist eine Zugriffseigenschaft: Sie gibt nur an, ob Ihre Variable schreibgeschützt (const) oder schreibgeschützt (nicht const) sein soll.

Statizität ist eine lebenslange (und technisch speicherlokalisierende) Eigenschaft: Sie gibt an, ob die Variable im Bereich einer Klasse (in einer Klasse) oder einer Übersetzungseinheit (in Verbindung mit einer in cpp definierten globalen Variablen) global ist. .

Klaim
quelle
-2

Dies ist nicht der Fall, und das offensichtlichste Beispiel ist, dass eine const-Membervariable (die natürlich vom Konstruktor initialisiert wird) nicht von allen Objekten dieser Klasse gemeinsam genutzt wird, sondern für jedes Objekt individuell ist.

class A {
public:
  A(int newx) : x(newx);
private
  int x;
}

litb gibt oben die beste Antwort.

Alex Brown
quelle
Tut er nicht immer? (litb)
RastaJedi
-5

Das tut es nicht. Folgendes schreiben:

const int i = 0;

macht nicht istatisch (weder in C noch in C ++).

Martin Cote
quelle