C++ const in Header

Gast #5061734
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?
Gast
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.
Gast
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;
Gast
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 ...
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).

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 9 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.