2016-01-25 4 views
5

Ich verwende eine statische Bibliothek (.lib-Datei) von Drittanbietern in einem C++ - Projekt. Der Autor der statischen Bibliothek hat mir eine Methode für eine Klasse hinzugefügt und mir einen aktualisierten Build der Bibliothek geschickt.Ist die Reihenfolge der Methodendeklarationen in einer Klasse für den Compiler wichtig?

Leider hat er keine neue Header-Datei gesendet und die Kommunikation mit ihm ist langsam, so dass ich den neuen Header bald nicht bekommen kann. Ich kenne die Methodensignatur der neuen Methode, also könnte ich sie einfach zur Header-Datei hinzufügen.

Meine Frage ist, ob es wichtig ist, wo in der Liste der öffentlichen Methoden ich die neue Deklaration (oben, unten, Mitte ...) hinzufügen. Meine beste Schätzung ist, dass es tut und dass die Reihenfolge in der Header-Datei die Reihenfolge in der kompilierten Klasse bestimmt. Kann jemand das bestätigen oder widerlegen?

+4

Mögliche doppelte: http://stackoverflow.com/questions/19858914/does-the-function-declaration-order-matter-in-a-header-file – user2079303

+1

Bitte haben Sie einen Blick auf [dieser Stackoverflow] (http : //stackoverflow.com/questions/19858914/does-the-function-declaration-order-matter-in-a-header-file), was alles im Detail erklärt. – Derlin

+0

Danke an euch beide. Die Frage, die Sie verlinken, hilft meinem Verständnis. – adv12

Antwort

11

Meine Frage ist, ob es darauf ankommt, wo in der Liste der öffentlichen Methoden I die neue Erklärung

AFAIK hinzufügen, es ist egal, ob die Elementfunktion ist eine regelmäßige Funktion, aber es zählt, wenn es sich um eine virtual Mitgliedsfunktion. Die virtuellen Mitgliedsfunktionen in der virtuellen Tabelle sind in einer bestimmten Reihenfolge. Wenn die Bibliothek sie in einer anderen Reihenfolge als Ihre .h-Datei enthält, werden Sie höchstwahrscheinlich die falsche Funktion aufrufen.

Verwandte: Force the order of functions in the virtual method table?

+0

Wow, ich hatte nicht an das Problem mit 'virtuellen' gedacht, aber es scheint ein sehr reales Risiko zu sein. Die oben verlinkten Duplikate erwähnen es im Vorbeigehen, und die KDE-Verbindung scheint aus ABI-Perspektive in die Tiefe zu gehen. –

+0

Danke für die Info. In meinem Fall sind die Funktionen nicht virtuell, also füge ich einfach die neue Methodendeklaration am Ende der Liste hinzu und hoffe, dass du recht hast :) – adv12

+0

@ adv12, ich wurde von der Reihenfolge der virtuellen Tabellen gebissen vor einiger Zeit, in den frühen 2000er Jahren. Wenn die Elementfunktion eine reguläre Elementfunktion ist, sollten Sie in Ordnung sein. Viel Glück. –

0

Wenn die Methodendeklaration verwendet Typen nicht wie zum Beispiel in der Klasse deklarierten der Rückgabetyp es dann keine Rolle spielt, wo die Methode deklariert wird.

Andernfalls, wenn eine Methodendeklaration von Deklarationen anderer Typen innerhalb der Klasse abhängt, kann ein Fehler auftreten.

Zum Beispiel wird der Compiler einen Fehler für diese Klassendefinition Ausgabe

struct A 
{ 
    B f(); 
    struct B {}; 
    //... 
}; 

weil Typ struct B in der Member-Funktion Erklärung verwendet wird f vor der Strukturdeklaration selbst.

+0

Danke für die Info. In meinem Fall ist die Funktion ein 'void something (CString)' (MFC-String-Klasse) und verwendet keine Typen, die im Header definiert sind. Es ging mir also darum, ob die falsche Deklaration der Methode an die falsche Stelle in der Klassendefinition gestellt würde. Aber ich habe den Linker vergessen.Ich bin am besten mit C# vertraut, wo diese Art von Frage nicht aufkommt. – adv12

+0

@ adv12 In diesem Fall gibt es kein Problem, wenn die Funktionsdeklaration nicht von den Deklarationen anderer Klassenmitglieder abhängt. –

0

Methodendeklarationen in einer Klasse sollten für den Compiler keine Rolle spielen, außer es hängt von einer Variablendeklaration ab, die noch nicht erfolgt ist.

Verwandte Themen