Forum: Mikrocontroller und Digitale Elektronik C++ const in Header


von dell (Gast)


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?

von Wilhelm M. (wimalopaan)


Lesenswert?

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.

von dell (Gast)


Lesenswert?

Danke, nur wie bekomme ich das eingestellt, damit die Warnung 
verschwindet.

von Wilhelm M. (wimalopaan)


Lesenswert?

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 ... ;-)

von dell (Gast)


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.

von Wilhelm M. (wimalopaan)


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.

von Hans (Gast)


Lesenswert?

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;

von Rolf M. (rmagnus)


Lesenswert?

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.

von Carl D. (jcw2)


Lesenswert?

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?

von Hans (Gast)


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.

von Wilhelm M. (wimalopaan)


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

von Wilhelm M. (wimalopaan)


Lesenswert?

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.

von Carl D. (jcw2)


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.

von Wilhelm M. (wimalopaan)


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

von Carl D. (jcw2)


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.

von Wilhelm M. (wimalopaan)


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

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
Noch kein Account? Hier anmelden.