XCode: Linker-Merkwürdigkeit...

der_Kay

der_Kay

Aktives Mitglied
Thread Starter
Dabei seit
02.09.2004
Beiträge
1.765
Reaktionspunkte
25
Hallo zusammen,

Folgendes Codefragment wird von XCode 2.2 ohne Warnung kompiliert und "gelinkt":
Code:
class A{ public: A(); }; int main () { A a; }
Problem: Der Default-Konstruktor hat keinen Body. Beim Ausführen gibt es erwartungsgemäß ein SIGABORT. Das Linken wird vom g++ in der Shell korrekterweise verweigert.
Da ich noch keinen tieferen Plan von XCode hab, frag ich mich, wie ich sicherstelle, dass mein Code korrekt erzeugt und gelinkt wird.

Dieses "ZeroLink" ist übrigens deaktiviert.
 
mich stören die "Editor-Zipper" immer , ich hab's daher mal
augenfreundlich angeordnet: :)

Code:
class A { 
  public: 
    A(); // Body fehlt - einverstanden
}; 

int main () { 
  A a;  
}


Mein Verdacht:


A(); ist ja syntaktisch korrekt, es handelt sich um die Deklaration einer C-Funktion.
Das allein ist also keinen Fehler wert.
Für den Compiler heißt das Implementierung kommt später. Das die gar nicht kommt kann er zu dem Zeitpunkt noch nicht wissen. Offenbar fällt das erst beim Starten auf, das der linker dafür keinen Symboleintrag generiert hat.
 
wegus schrieb:
es handelt sich um die Deklaration einer C-Funktion.
Unmöglich, steht im Kontext einer Klassendeklaration.
wegus schrieb:
Offenbar fällt das erst beim Starten auf, das der linker dafür keinen Symboleintrag generiert hat
Genau dafür ist ein Linker aber da.

Man kann XCode sogar diesen Blödsinn "kompilieren" und "linken" lassen:
Code:
class A
{; }; 
int main () 
{ 
    A a,b (a); 
    b=a; 
}
Hier werden ein nicht existenter Default- und Copy-Konstruktor sowie ein undefinierter A:: operator= aufgerufen. Einen undefinierten A:: operator+ merkt XCode dagegen. Dafür hab ich keine Erklärung. In der Shell wird das auch korrekt abgewehrt.
Mir scheint, dass da irgendwas "inkrementell" gelinkt wird, um die Geschwindigkeit zu steigern. Würd mich interessieren, wie man sicherstellt, das 100%ig gelinkt wird.

(A::eek:perator sieht ja geil aus ;) )
 
Zuletzt bearbeitet:
so eine Deklaration müßte trotzdem erlaubt sein. Dein zweites Beispiel ist wohl eher was für Comiler-Landwirte ;)
 
Habt ihr das mit Debug order Release Konfiguration gemacht?
 
Das zweite Beispiel kompiliert und läuft wider Erwarten. Aber das erste ist nach wie vor schräg. Ist "Debug", aber irgendwie glaub ich nicht, dass das einen Unterschied macht, denn der Linker sollte in jedem Fall die Symbole checken.
 
Zurück
Oben Unten