C++ Compiler Warnung ausgeben


  • Administrator

    Hallo zusammen,

    Glaube zwar nicht, dass es sowas gibt, wollte aber noch nachfragen.
    Gibt es im C++ Standard eine Möglichkeit eine Compiler-Warnung zu erzeugen? Also etwas wie:
    #warning Achtung!

    Hintergrund ist, dass ich etwas in der Art habe:

    template<unsigned int decimals>
    class Real
    {
    public:
      template<unsigned int d>
      Real& operator =(Real<d> const& r)
      {
        if(decimals < d)
        { /* Warnung! */ }
      }
    };
    

    Grüssli



  • warum sollte der compiler zur laufzeit des programms eine warnung ausgeben? da ist er mitunter tausende kilometer und mehrere jahre vom programm entfernt..



  • Dravere sprach aber von Compiler-Warnung und nicht Laufzeit-Warnung...



  • ne, es gibt nur fehler oder nicht fehler. warnungen gehen nicht - zumindest nicht portabel.


  • Administrator

    Shade Of Mine schrieb:

    ne, es gibt nur fehler oder nicht fehler. warnungen gehen nicht - zumindest nicht portabel.

    Dachte ich mir, aber wenn du es gerade ansprichst, was gibt es für nicht portable Möglichkeiten? Unter MSVC habe ich nur das #pragma message gefunden, aber da kann ich keine Bedingung dran knüpfen.

    Naja, ich denke allerdings, dass ich es womöglich als Fehler hinsetzen werde und das über BOOST_STATIC_ASSERT . Dafür eine Methode à la round , new_decimal oder sowas und einen explicit Konstruktor, welche auch konvertieren kann.
    Es erscheint mir sicherer, als gar nichts auszugeben.

    Grüssli



  • Was wäre mit einem Makro, das man zuerst definieren muss, um die Fehler ignorieren zu können? Dann merkt man als Normal-User (der das Makro nicht kennt), dass etwas nicht stimmt und behebt das. Als Advanced-User kann man es wie eine Warnung ignorieren (etwas böse gesagt) oder wenigstens das Programm kompilieren.


  • Administrator

    Nexus schrieb:

    Was wäre mit einem Makro, das man zuerst definieren muss, um die Fehler ignorieren zu können?

    Fehler ignorieren? Warnung ignorieren? Das sollte nicht mal ein advanced User 😉
    Ich mache das lieber eindeutig als Fehler hin und biete Möglichkeiten an, womit man die Sache explizit erreichen kann. So weiss man immer, was man tut 😉

    Grüssli



  • Nun ja, ich meinte nur, weil Warnungen leider auch teilweise ignoriert werden (auch unabsichtlich, wenn eine zu niedrige Warnstufe eingestellt ist). Und da ich dachte, Fehler könntest du nicht brauchen, da es die Kompilierung verhindert, habe ich das mal geschrieben... 😉



  • im gcc gibts afaik eine Präprozessordirektive #warning - ich weiß nicht wie verbreitet die ist...



  • pumuckl schrieb:

    im gcc gibts afaik eine Präprozessordirektive #warning - ich weiß nicht wie verbreitet die ist...

    Ja, die gibts auch sonst, aber das ist eben der Präprozessor.

    Ist es so schwierig, Compilerwarnung zu verstehen? 😉
    Du bist jetzt schon der Zweite... :p



  • Schau dir mal in Alexandrescu's "modern C++ design" den STATIC_ASSERT Mechanismus an. Wenn du statt der nicht möglichen Konvertierung die bei ihm den Error veruracht eine Konvertierung nimmst, die in (möglichst vielen) Compilern eine Warnung verursacht, hast dus.



  • pumuckl schrieb:

    Schau dir mal in Alexandrescu's "modern C++ design" den STATIC_ASSERT Mechanismus an. Wenn du statt der nicht möglichen Konvertierung die bei ihm den Error veruracht eine Konvertierung nimmst, die in (möglichst vielen) Compilern eine Warnung verursacht, hast dus.

    Irgendwie funktioniert der STATIC_ASSERT bei mir nicht. Ich bekomme unter MSVC 2008 immer den Fehler:

    error C2070: 'CompileTimeChecker<__formal> (safe_reinterpret_cast::ERROR_DESTINATION_TYPE_TO_NARROW (__cdecl *)(void))': Ungültiger sizeof-Operand
    

    Irgendwie weiss ich damit nicht so recht was anzufangen. Hat wer eine Ahung, woran das liegen könnte?


  • Administrator

    pumuckl schrieb:

    Schau dir mal in Alexandrescu's "modern C++ design" den STATIC_ASSERT Mechanismus an. Wenn du statt der nicht möglichen Konvertierung die bei ihm den Error veruracht eine Konvertierung nimmst, die in (möglichst vielen) Compilern eine Warnung verursacht, hast dus.

    Als ich das implementieren wollte, ist mir das folgende aufgefallen:
    http://www.boost.org/doc/libs/1_36_0/boost/static_warning.hpp
    Dieser Header ist mir bisher nirgends über den Weg gelaufen. Aber Boost hat das anscheinend bereits drin.

    Wäre noch praktisch, wenn man eine Meldung dazugeben könnte, aber wird wohl ohne gehen müssen. Vielleicht im nächsten Standard? Zumindest soll ja dort ein static_assert kommen, oder?

    Grüssli


Anmelden zum Antworten