wollte ich mit externer Verlinkung und unvollständigem Typ Erklärungen experimentieren und schrieb folgendes Beispiel:C++ extern Verknüpfung
Source.cpp:
//Source.cpp
class A {
public:
int a=10;
};
A* var1 = new A();
void printA(A* arg)
{
cout << arg->a << endl;
}
source1.cpp:
//Source1.cpp
class A
{
public:
int b = 20;
int c = 30;
};
A* var2 = new A();
void printB(A* a)
{
std::cout << a->b;
}
main. cpp:
//main.cpp
class A;
extern A* var1;
extern A* var2;
int main()
{
void printA(A*);
void printB(A*);
printA(var1); //Prints 10
printA(var2); //Prints 10
printB(var2); //Prints 10
return 0;
}
Nach dem ersten Anruf von printA()
wird "10" wie erwartet gedruckt. Aber warum "10" wird auch nach dem zweiten Aufruf von printA()
und printB()
gedruckt?
Also das ist undefiniertes Verhalten? – Nikita
@Nikita Der Standard sagt, dass es ein undefiniertes Verhalten ist, aber ich denke, sie wollten sagen, es ist schlecht geformt, keine Diagnose erforderlich. Wenn ein ungültiges NDR-Programm tatsächlich kompiliert und ausgeführt wird, ist das Verhalten nicht definiert. – Brian