C++ Compiler Warnung ausgeben
-
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.
-
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 à laround
,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.
-
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 tutGrü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?
-
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