Hallo, wenn ich im Header folgendes stehen habe, bekomme ich diese Warnung: const uint8_t varA = 0; warning: non-static data member initializers only available with -std=c++11 or -std=gnu++11 Mache ich das im Header aber so: const uint8_t varA; und bemühe eine Initialisierungsliste am Konstruktor, dann kommt diese Warnung nicht. Ich benutze SW4STM32 als Entwicklungsumgebung. kann ich da irgendwas einstellen, dass diese Warnung nicht mehr kommt, beziehungsweise wo folgendes setzen -std=c++11, sofern das überhaupt hilft?
dell schrieb: > Ich benutze SW4STM32 als Entwicklungsumgebung. > kann ich da irgendwas einstellen, dass diese Warnung nicht mehr kommt, > beziehungsweise wo folgendes setzen -std=c++11, sofern das überhaupt > hilft? Das hilft! Ab C++11 sind in-class initializer (als brace-or-equal form) erlaubt.
dell schrieb: > Danke, nur wie bekomme ich das eingestellt, damit die Warnung > verschwindet. Dort, wo Du alles anderen Compiler-Flags auch setzt - aber frag mich nicht, wo das ist ... ;-)
War erfolgreich. So geht es: *Right-click on the the project and select "Properties" *Navigate to C/C++ Build -> Settings *Select the Tool Settings tab. *Navigate to GCC C++ Compiler -> Miscellaneous In the option setting labeled Other Flags add -std=c++11 Now rebuild your project.
dell schrieb: > War erfolgreich. > > So geht es: > > *Right-click on the the project and select "Properties" > *Navigate to C/C++ Build -> Settings > *Select the Tool Settings tab. > *Navigate to GCC C++ Compiler -> Miscellaneous > > In the option setting labeled Other Flags add -std=c++11 > Now rebuild your project. Probier auch mal -std=c++14,-std=c+1z oder -std=c++17 je nach Compiler. Dann hast Du die neuesten features zur Verfügung.
Muss es denn wirklich einen non-static Member sein? Mit static geht es schon immer und braucht keinen zusätzlichen Speicher in jeder Instanz:
1 | static const uint8_t varA = 0; |
Hans schrieb: > Muss es denn wirklich einen non-static Member sein? > > Mit static geht es schon immer und braucht keinen zusätzlichen Speicher > in jeder Instanz: Naja, dafür existiert die Variable dann aber auch nur ein einziges Mal und nicht einmal pro Instanz.
Rolf M. schrieb: > Hans schrieb: >> Muss es denn wirklich einen non-static Member sein? >> >> Mit static geht es schon immer und braucht keinen zusätzlichen Speicher >> in jeder Instanz: > > Naja, dafür existiert die Variable dann aber auch nur ein einziges Mal > und nicht einmal pro Instanz. Wozu sollte die Konstante pro Instanz existieren?
Wann braucht man denn eine konstante "Variable" in jeder Instanz, die auch noch in jeder Instanz den gleichen Wert hat, wenn man sie wie oben gezeigt initialisiert? Der einzige Anwendungsfall, der mir spontan einfällt, wäre wenn der Member Teil einer Struktur ist, die man als einen zusammenhängenden Datenblock über eine externe Schnittstelle schickt. Dann könnte das z.B. eine konstante Nachrichten-ID sein.
Carl D. schrieb: > Rolf M. schrieb: >> Hans schrieb: >>> Muss es denn wirklich einen non-static Member sein? >>> >>> Mit static geht es schon immer und braucht keinen zusätzlichen Speicher >>> in jeder Instanz: >> >> Naja, dafür existiert die Variable dann aber auch nur ein einziges Mal >> und nicht einmal pro Instanz. > > Wozu sollte die Konstante pro Instanz existieren? Jedes Objekt kann soviel konstante Elementvariablen haben, wie es möchte. Banales Beispiel: eine Seriennummer! Das sind jetzt aber OOP Basics ...
Hans schrieb: > Wann braucht man denn eine konstante "Variable" in jeder Instanz, die > auch noch in jeder Instanz den gleichen Wert hat, wenn man sie wie oben > gezeigt initialisiert? Das ist nicht gesagt: Elementinitialisierer überschreiben die in-class initializer.
Wilhelm M. schrieb: > Hans schrieb: >> Wann braucht man denn eine konstante "Variable" in jeder Instanz, die >> auch noch in jeder Instanz den gleichen Wert hat, wenn man sie wie oben >> gezeigt initialisiert? > > Das ist nicht gesagt: Elementinitialisierer überschreiben die in-class > initializer. Dann würde ich aber nicht den Eindruck erwecken, daß der Wert fix wäre, sondern den Konstruktor-Parameter mit Default versehen und nicht mit Nichtoffensichtlichkeiten der Sprachdefinition hantieren. Aber wenn man sich ein bischen anstrengt, dann kann man viele C++-Vorurteile bedienen.
Carl D. schrieb: > Wilhelm M. schrieb: >> Hans schrieb: >>> Wann braucht man denn eine konstante "Variable" in jeder Instanz, die >>> auch noch in jeder Instanz den gleichen Wert hat, wenn man sie wie oben >>> gezeigt initialisiert? >> >> Das ist nicht gesagt: Elementinitialisierer überschreiben die in-class >> initializer. > > Dann würde ich aber nicht den Eindruck erwecken, daß der Wert fix wäre, ???????? ... wirr > sondern den Konstruktor-Parameter mit Default versehen und nicht mit > Nichtoffensichtlichkeiten der Sprachdefinition hantieren. was hat das damit zu tun ?????
Wilhelm M. schrieb: > Carl D. schrieb: >> Wilhelm M. schrieb: >>> Hans schrieb: >>>> Wann braucht man denn eine konstante "Variable" in jeder Instanz, die >>>> auch noch in jeder Instanz den gleichen Wert hat, wenn man sie wie oben >>>> gezeigt initialisiert? >>> >>> Das ist nicht gesagt: Elementinitialisierer überschreiben die in-class >>> initializer. >> >> Dann würde ich aber nicht den Eindruck erwecken, daß der Wert fix wäre, > > ???????? ... wirr > >> sondern den Konstruktor-Parameter mit Default versehen und nicht mit >> Nichtoffensichtlichkeiten der Sprachdefinition hantieren. > > was hat das damit zu tun ????? Wann soll denn die Konstante ihren Wert bekommen? Wohl zur Konstruktionszeit und wenn ich nicht jeder Instanz den selben Wert geben will, braucht es einen Parameter des Konstruktors. Falls dieser oft den selben Wert hat, eben mit Default. Das steht dann im Quellcode gut lesbar drin. Wenn ich Dan zusätzlich die (neue) Kurzform verwende, die den Eindruck erweckt, die Konstante hätte immer den selben Wert, aber Hurra, der Standard sagt ja, das zählt hier nicht. Für Nicht-Konstantes macht das Sinn, aber im konkreten Fall führt es zu unnötiger Verwirrung. Gut nach 20Jahren leben von OO-Software-Schreiben (auch in C++) bin ich bestimmt zu ahnungslos.
Carl D. schrieb: > Wilhelm M. schrieb: >> Carl D. schrieb: >>> Wilhelm M. schrieb: >>>> Hans schrieb: >>>>> Wann braucht man denn eine konstante "Variable" in jeder Instanz, die >>>>> auch noch in jeder Instanz den gleichen Wert hat, wenn man sie wie oben >>>>> gezeigt initialisiert? >>>> >>>> Das ist nicht gesagt: Elementinitialisierer überschreiben die in-class >>>> initializer. >>> >>> Dann würde ich aber nicht den Eindruck erwecken, daß der Wert fix wäre, >> >> ???????? ... wirr >> >>> sondern den Konstruktor-Parameter mit Default versehen und nicht mit >>> Nichtoffensichtlichkeiten der Sprachdefinition hantieren. >> >> was hat das damit zu tun ????? > > Wann soll denn die Konstante ihren Wert bekommen? Na, durch einen Elementinitialisierer. > Wohl zur Konstruktionszeit und wenn ich nicht jeder Instanz den selben > Wert geben will, braucht es einen Parameter des Konstruktors. Nicht notwendigerweise ... > Wenn ich Dan zusätzlich die (neue) Kurzform > verwende, die den Eindruck erweckt, die Konstante hätte immer den selben > Wert, aber Hurra, der Standard sagt ja, das zählt hier nicht. Für > Nicht-Konstantes macht das Sinn, aber im konkreten Fall führt es zu > unnötiger Verwirrung. Gut nach 20Jahren leben von OO-Software-Schreiben > (auch in C++) bin ich bestimmt zu ahnungslos. Was soll daran verwirrend sein??? Wenn ein Member in der Elementinitialisierungsliste initialisiert wird, ist doch alles klar. Tja, und falls nicht .... (ich hoffe, Du bist noch nie über default-initialisierte Member fundamentaler DT gestolpert).
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.