Frage

Ich habe einige Antworten zu diesem Thema gelesen, bin mir aber immer noch nicht sicher:

In C ++ wird eine globale konstante Variablendefinition automatisch static.Ich kann jedoch von einer anderen CPP-Datei über extern darauf zugreifen:

// module.cpp

const int i = 0;

und

// main.cpp

extern const int i;

int main ()
{
    if (i > 10)
        return 0;
    else
        return 1;
}

Warum ist das möglich (Zugriff auf ein Objekt mit interner Verknüpfung von einem anderen Modul)?Normalerweise sollte ich gezwungen sein zu definieren i als extern const int i = 0 im Modul.cpp, um eine explizit zu haben globale, aber nicht statische Konstante, oder?

Im Vergleich dazu ist dies nicht möglich:

// module.cpp

static int i = 0;

und

// main.cpp

extern int i;

int main ()
{
    i = 10; // but read-only access like (i > 10) would be possible!
    return 0;
}

So ist die Antwort, dass:ja, Sie können auf intern verknüpfte Objekte aus anderen Modulen zugreifen, aber nur zum Lesen (also immer mit const )?

Bearbeiten:

Entschuldigung, aber ich habe einen Fehler gemacht:in meinem ursprünglichen Code habe ich gerade einen Ausdruck ausprobiert ohne Wirkung (in beiden Beispielen):

extern const int i; // or extern int i for second example
int main ()
{
    i>10;
    return 0;
}

Ich dachte, dass es sich genauso verhält, als ob Programmfluss oder Daten von diesem Ausdruck abhängig wären, aber tatsächlich nicht!Der Compiler scheint diesen wirkungslosen Ausdruck einfach auszuschneiden, so dass der Linker ihn nicht sieht!Also ist alles in Ordnung:im ersten Beispiel i muss in der Tat definiert werden extern const int i = 0 im Modul.cpp und im zweiten Beispiel i kann überhaupt nicht zugegriffen werden (außer in wirkungslosem Ausdruck).Der Compiler ist VC ++ 2010.

Bearbeitung2:

Jetzt verstehe ich jedoch nicht, warum das möglich ist:

// module.cpp

extern const int i = 0;

und

// main.cpp

int i = 99;

int main ()
{
    bool b = i>10;
    return 0;
}

i haben beide externe Verknüpfung.Aber kein Fehler.Wenn im Modul.cpp Ich definiere int i = 0, dann Fehler (mehrere Symbole).Warum?

War es hilfreich?

Lösung

Für mich sieht es nach einem Compiler-Fehler aus.Die konstante Variable i ist nicht definiert, sie wird nur in main deklariert.kpp.Wie für Variable i im Modul.cpp dann hat es eine interne Verknüpfung und darf außerhalb des Moduls nicht zugänglich sein.

In Bezug auf Ihren Zusatz zum ursprünglichen Beitrag hat der Compiler mit dieser Situation nichts gemeinsam.Es ist ein Linker, der prüft, ob doppelte externe Symbole vorhanden sind.Ich denke, es wurde entschieden, dass es zwei verschiedene Variablen gibt, wenn eine Variable das Qualifikationsmerkmal const und die andere keine hat.Ich denke, dass die Implementierung definiert ist, ob der Linker einen Fehler ausgibt oder nicht.Darüber hinaus kann es einige Optionen geben, die das Verhalten des Linkers in solchen Situationen steuern könnten.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top