totale inline verwirrung



  • hoi leute

    wo liegt bei folgendem code der fehler ?

    TxlString.cpp

    #include "TxlString.h"
    
    inline txl::string::string(const char *c_string) : data(0)
    {
       unsigned int t_size = strlen(c_string) + 1;
    
       data = xallocb(data, t_size); 
       memcpy(data, c_string, t_size);
    
       len = t_size - 1;
       capacity = t_size;
    }
    
    inline txl::string::~string(void)
    {
       if(data)
          free(data);
    }
    

    TxlString.h

    #ifndef TxlStringH
    #define TxlStringH
    
    #include "TxlHelper.h"
    #include <string.h>
    
    namespace txl
    {
       class string
       {
          private: 
    
             char *data;
             unsigned int len;
             unsigned int capacity;
    
          public:
             inline string(void) : data(0), len(0), capacity(0) { }
    
             inline string(const char *c_string);
    
             inline ~string(void);
       };
    }
    

    main.cpp

    #include <stdio.h>
    #include "TxlString.h"
    
    int main(void)
    {
       txl::string str;
    
       return 0;
    }
    

    Fehlermeldung:

    Compiling source file(s)...
    main.cpp
    TxlString.h:24: warning: inline function `txl::string::~string()' used but
    never defined
    TxlString.cpp
    Linking...
    K:\Txl\TxlString\Debug\main.o(.text+0x30): In function `main':
    K:\Txl\TxlString\main.cpp:9: undefined reference to `txl::string::~string()'
    

    der zweite konstruktor mit inline funktioniert ja auch

    weiß jemand rat ?

    Meep Meep



  • Spar Dir doch endlich mal die ganzen inlines. Dann klappt's auch.

    inline bedeutet nicht:

    der Compiler fügt den Code statt des Funktionsaufrufs ein.

    inline bedeutet:

    Ändere die ODR (One Definition Rule) für diese Entität. Normalerweise darf und muß eine Entität, die benutzt wird in einem Programm genau einmal definiert werden. Wenn Du inline davorschreibst ändert sich das so, daß es in jeder Übersetzungseinheit (ÜE) einmal definiert werden darf und muß.

    Dein main ist eine ÜE, sie enthält aber die Definition der Members (bis auf den Konstruktor) nicht.

    Selbst beim Konstruktor kannst Du das inline weglassen, da Funktionen, die direkt in der Klasse implementiert sind automatisch inline sind.

    MfG Jester



  • wieso gibt es dann das schluesselwort, wenn ich es nicht verwenden soll ?
    die erste konstruktor steht nur deshalb in der header, weil ich ausprobieren wollte ob es so funktioniert.
    da kommen noch genug member dazu, die ich erst in der cpp-datei schreibe und trotzdem als inline haben will.

    laut dem Buch "C++" von Stalay und Lajoie sollte das mit dem destruktor auch funktionieren.
    schliesslich waere es nicht grad geschickt, wenn ich, nur weil es grad nicht klappt, auf sowas verzichten soll.

    Meep Meep



  • Der Compiler kann nur (bzw. besser) inlinen, wenn er die Definition der Funktion von der Aufrufstelle aus sieht. Das ist im Allgemeinen nur möglich, wenn man die Funktion in einem Header definiert. Nun würde das aber zu Mehrfachdefinitionen führen. Es sei denn: 1) die Funktion ist innerhalb einer Klasse definiert 2) die Funktion ist inline markiert 3) es handelt sich um ein Template. Nun führt das aber gleichzeitig dazu, dass die Funktion sichtbar sein MUSS, um überhaupt aufgerufen werden zu können.

    Also entweder: Funktion ohne inline in die .cpp, oder Funktion mit inline in den Header.



  • Meep Meep schrieb:

    wieso gibt es dann das schluesselwort, wenn ich es nicht verwenden soll ?

    Du kannst es schon verwenden, dann aber richtig. Allerdings bei Deinem momentanen Einsatz hast Du dadurch vermutlich keinerlei Gewinn und zusätzlich funktioniert es auch noch nicht.


Anmelden zum Antworten