C++ const in Header

Gast #5061734
Lesenswert?

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 #5061767
Lesenswert?

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.
#5061768
Lesenswert?

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 #5061893
Lesenswert?

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.
#5061895
Lesenswert?

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 ...
#5061905
Lesenswert?

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.
#5061909
Lesenswert?

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 ?????
#5061917
Lesenswert?

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.
#5061927
Lesenswert?

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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren