Frage zu einer Warnung



  • Hallo zusammen,
    ich habe ein Template erstellt und bekomme vier Warnungen. Sie lauten:

    [C++ Warnung] Unit1.h(49): W8027 Funktionen, die for enthalten, werden nicht als Inline expandiert

    Kann ich diese ignorieren oder sollte ich auf diese eingehen. Was ist so schlimm daran, wenn ich in einem Template for-Schleifen habe? Wenn ich diese ignorieren kann (was ich eigentlich nicht möchte, doch weiß ich nicht wie groß der Aufwand ist, das Template umzuschreiben), muss ich laut BCB Hilfe folgende Kommandozeilen eingeben: -w-mpc

    Ich weiß nur leider nicht, wo ich diese eingeben muss! Naja, mir wäre es lieber, wenn ich mir helfen könntet die Warnungen wegzukriegen.

    Vielen Dank
    lg, freakC++


  • Mod

    Was ist denn daran nicht zu verstehen? Du hast Funktionen inline gemacht (entweder direkt durch das inline Schlüsselwort oder indirekt indem du sie gleich in der Klassendeklaration definiert hast) und der Compiler sagt dir, dass er das ignoriert, weil er sich für schlauer hält als dich.



  • Vielleicht die Tatsache, daß man Templates in der Regel als inline definiert? Wie soll man diesen Umstand also abschaffen, ohne die Warnung an sich zu desaktivieren.

    Gruß Kimmi


  • Mod

    kimmi schrieb:

    Vielleicht die Tatsache, daß man Templates in der Regel als inline definiert?

    Wie kommst du denn darauf?

    #include <iostream>
    
    template <typename T> class test{
    private:
      T t;
    public:
      test(const T& tt): t(tt){}
      void show();
    };
    
    template<typename T> void test<T>::show(){ // Nicht inline
      for (int i=0; i<100; i++){
        std::cout<<t<<std::endl;
      }
    }
    
    int main(){
      test<double> my_test(5.);
      my_test.show();
    }
    

    Wenn man versteht(!), was eine Warnung soll, ist es auch kein Problem sie zu ignorieren.



  • SeppJ schrieb:

    Wenn man versteht(!), was eine Warnung soll, ist es auch kein Problem sie zu ignorieren.

    Und erst recht nicht, sie abzuschalten - entweder durch (compilerspezifische) #pragmas oder (besser) indem man die Ursache behebt. Warnungsfrei zu compilieren hat nämlich diverse Vorteile, z.B. übersieht man nciht zwischen den 500 Warnungen, die man verstanden (!) und ignoriert hat die eine Warnung, die auf einen tatsächlichen Fehler hinweist.



  • Bist du da sicher? In deinem Beispiel benutzt du zwar nicht das Statement inline, aber das Template wird während des Compiles als Schablone benutzt, um den gewünschten Code zu generieren. Von da aus mussten die Template-Implementierungen immer geinlined vorliegen ( also im Header beispielsweise oder wie bei dir direkt mit Implementierung im Source-File).
    Oder liege ich da falsch?

    Bezüglich dem Ignorieren von Warnings: Volle Zustimmung! Und wenn man sie per Pragma abschaltet: am besten so lokal wie möglich.

    Gruß Kimmi



  • kimmi schrieb:

    Bist du da sicher? In deinem Beispiel benutzt du zwar nicht das Statement inline, aber das Template wird während des Compiles als Schablone benutzt, um den gewünschten Code zu generieren. Von da aus mussten die Template-Implementierungen immer geinlined vorliegen ( also im Header beispielsweise oder wie bei dir direkt mit Implementierung im Source-File).
    Oder liege ich da falsch?

    Ja, völlig falsch. Zum Einen haben Templates keine Sourcen, weil die kompletten definitionen immer mit #included werden müssen. Zum Anderen müssen Template-Implementierungen anders als bei normalen Klassen nicht geinlined werden, obwohl sie mit im Header stehen. Das hat zwar zur Folge, dass z.B. eine Methode Foo<int>::bar in mehreren Übersetzungseinheiten vorliegen kann, das darf den Linker allerdings nicht stören, er nimmt dann einfach irgendeine davon. Allerdings muss sichergestellt sein, dass sie gleichwertig sind, d.h. aus einer Definition stammen (die sog. One Definition Rule).



  • Ok, danke für die Info!

    Gruß Kimmi



  • Hallo,
    vielen Dank für eure Antworten. Ich wusste nicht, dass wenn man die Methoden eines Templates direkt definiert, dass sie dann inline sind. Da ich auch der Meinung bin, auf die Warnungen einzugehen, frage ich mich, was ich nun tun soll? Soll ich alle Methoden umständlich eigens definieren oder was würdet ihr machen?

    Vielen Dank
    lg, freakC++


  • Mod

    Viele Compiler besitzen #pragma Direktiven, um Warnungen an bestimmten Stellen gezielt auszuschalten. Wie das geht, steht in der Anleitung deines Compilers oder, wenn es ein gängiger Compiler ist, kann sicherlich auch hier jemand erklären wie das geht.



  • freakC++ schrieb:

    Ich wusste nicht, dass wenn man die Methoden eines Templates direkt definiert, dass sie dann inline sind.

    Grundsätzlich sind alle Methoden, die in der Klassendefinition gleich mitdefiniert werden, implizit inline deklariert. Egal ob es dabei um Methoden von normalen Klassen oder von Klassentemplates geht.



  • freakC++ schrieb:

    Ich wusste nicht, dass wenn man die Methoden eines Templates direkt definiert, dass sie dann inline sind.

    Das ist unglücklich ausgedrückt. Definitionen von Elementfunktionen, die innerhalb der Klassendefinition stehen, sind automatisch "inline". Mit Templates hat das nichts zu tun.

    class A
     {
      public:
       void ich_bin_inline() {} 
       void ich_nicht();
     };
    
     void::ich_nicht() {}
    

    freakC++ schrieb:

    Da ich auch der Meinung bin, auf die Warnungen einzugehen, frage ich mich, was ich nun tun soll?

    Das musst Du wissen ... Man sollte sich jedenfalls im Klaren darüber sein, was inline bedeutet und wann Funktionen implizit inline sind. Ich würde wahrscheinlich diese Warnung ignorieren und ausschalten. Der G++ Compiler nervt mich mit so einer Warnung beispielsweise nicht.

    Gruß,
    SP



  • Dann ist mir jetzt auch klar, wo mein Trugschluß diesbezüglich lag.

    Gruß Kimmi



  • Ok,
    vielen Dank. Ich werde die Warnung abschalten.

    bis bald
    lg, freakC++


Anmelden zum Antworten