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. Also

    A 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?


  • Mod

    Um dir mal einen Anhaltspunkt zu geben, beim GCC geht das so:
    http://gcc.gnu.org/onlinedocs/gcc/Function-Attributes.html

    Also 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 noch

    Gruss 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 ='
    

Anmelden zum Antworten