Compiler Warnung erzeugen
-
Hallo zusammen,
ist es irgendwie möglich, selber Compilerwarnungen zu erzeugen ?
Bsp:int a = 7.124;
erzeugt die Compilerwarnung "möglicher Datenverlust oder so ähnlich".
Ich hab jetzt zwei Klassen A und B selber implementiert und den Gleichheitsoperator überschrieben und möchte bei der Zuweisung eben diese Compilermeldung erzeugen. AlsoA eins; B zwei; eins = zwei;
soll mich vor Datenverlust warnen. Ich hoffe, jemand kann mir da helfen.
Gruss CatDog
-
Dieser Thread wurde von Moderator/in SeppJ aus dem Forum C++ (auch C++0x) in das Forum Compiler- und IDE-Forum verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
CatDog11 schrieb:
ist es irgendwie möglich, selber Compilerwarnungen zu erzeugen ?
Das musst du wohl deinen Compiler fragen. Welcher darf's denn sein?
-
Um dir mal einen Anhaltspunkt zu geben, beim GCC geht das so:
http://gcc.gnu.org/onlinedocs/gcc/Function-Attributes.htmlAlso z.B.:
void foo() __attribute__((warning("Bar!"))); void foo(){}; int main() { foo(); }
Bei anderen Compilern wird das sicherlich ähnlich gehen.
-
Irgendwie scheint es ja nichts passendes zu geben. In einem anderen Thread
http://www.c-plusplus.net/forum/223198
wurde auch schon darüber diskutiert (den hab ich leider erst nach meinem beim googlen gefunden). Ausser #pragma message("") gibts anscheinend nichts passendes, zumindest in VS. Aber diese Message erscheint leider nicht in der Fehler- bzw. Warnungsliste. Dabei wollt ich doch eigtl. nur etwas ähnliches ausgeben wie bei
int i = 5.0 //erzeugt Compiler Warnung C4244 (möglicher Datenverlust usw.)
Schade, vielleicht weiss ja noch jemand was, ich schau mal noch ein paar mal rein,
vielen Dank nochGruss CatDog
-
Die Frage ist ja, was du damit bezwecken willst? Wäre es nicht sinnvoller den Code so zu formulieren, dass keine Warnung erforderlich, sprich die Anweisung eindeutig ist? Das könnte man zum Beispiel damit erreichen, indem man die Zuweisung nur über einen Setter zulässt. Um die Warnung über die Compilererweiterung zu erzwingen würdest du um entsprechende Setter in keinem Fall kommen, weil diese Warnungen im Code erst angetriggert werden müssen.
Um solche Probleme zu vermeiden hat man sich in anderen Sprachen (zB Java)dazu entschlossen Operatorüberladung ganz zu vermeiden.
-
Unter VC kann man funktionen mit
__declspec(deprecated)
als veraltet markieren. Wenn sie benutzt werden wird eine Warnung ausgespuckt, in deinem Fall z.B. so:
class B; class A { public: A() : a(1) {} __declspec(deprecated) A& operator=(const B& b); int a; }; class B : public A { public: B() : b(2) {} int b; }; A& A::operator=(const B& b) { a = b.a; return *this; } int main() { B b; A a; a = b; // erzeugt warnung }
erzeugt
main.cpp(28): warning C4996: 'A::operator =': wurde als veraltet deklariert main.cpp(7): Siehe Deklaration von 'A::operator ='