Frage

Betrachten Sie die folgenden Quelldateien 1.cpp

#include <iostream>

using namespace std;

struct X
{
    X()
    {
        cout << "1" << endl;
    }
};

void bar();

void foo()
{
    X x;
}

int main()
{
    foo();
    bar();
    return 0;
}

2.cpp

#include <cstdio>

struct X
{
    X()
    {
        printf("2\n");
    }
};

void bar()
{
    X x;
}

Ist das aus diesen Dateien kompilierte Programm wohlgeformt?Was sollte in der Ausgabe enthalten sein?

Ich habe einen Linkerfehler aufgrund eines Verstoßes gegen die One Definition Rule oder der Ausgabe "1 2" erwartet.Beim Kompilieren mit g ++ 3.4 und VC 8.0 wird jedoch "1 1" ausgegeben.
Wie kann das erklärt werden?

War es hilfreich?

Lösung

Dies verstößt gegen ODR (3.2) - insbesondere, dass Sie mehr als eine Definition einer Inline-Funktion haben können, diese Definitionen müssen jedoch identisch sein (3.2 / 5) - und führt zu undefiniertem Verhalten, sodass alles passieren kann und der Compiler/ linker ist nicht erforderlich, um dies zu diagnostizieren.Der wahrscheinlichste Grund, warum Sie dieses Verhalten sehen, ist, dass Funktionsaufrufe inline sind und nicht an der Verknüpfung teilnehmen, sodass kein Verknüpfungsfehler ausgegeben wird.

Andere Tipps

Es ist ein undefiniertes Verhalten (ohne erforderliche Diagnose), wenn inline-Funktionen (z. B. Ihr Klassenkonstruktor) unterschiedliche Definitionen in verschiedenen Übersetzungseinheiten haben.

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