2016-11-25 4 views
2

Ich verwende die dynamische Zuordnung zum ersten Mal und der Compiler gibt mir diese Warnung, die ich nirgendwo anders finden konnte:Warnung bei der Zuweisung dynamisch Speicher

warning: non-static data member initializers only available with 
-std=c++11 or -std=gnu++11 

Gibt es eine Möglichkeit, es zu machen desappear? Kümmert mich das? Danke!

+5

Abgesehen von der Warnung, müssen Sie Code, der dies verursacht, zu buchen. –

+2

Welcher Teil von "-std = C++ 11" ist unklar? –

+4

Ja, Sie sollten sich um die Warnung kümmern. Und bevor Sie Ihrem Kompilierungsbefehl blind ein Flag hinzufügen, um die Warnung verschwinden zu lassen, sollten Sie die Art des Problems verstehen, vor dem der Compiler warnt. –

Antwort

5

Das Problem:

Es hat nichts mit dynamischer Zuordnung zu tun.

Sie sind wahrscheinlich eine dieser Methoden für die Daten Memberinitialisierungsliste verwendet, die Teil von C++ 11:

class S 
{ 
    int n;    // non-static data member 
    int& r;    // non-static data member of reference type 
    int a[10] = {1, 2}; // non-static data member with initializer (C++11) 
    std::string s, *ps; // two non-static data members 
    struct NestedS { 
     std::string s; 
    } d5, *d6;   // two non-static data members of nested type 
    char bit : 2;   // two-bit bitfield 
}; 

Source

Der Compiler sagt Ihnen, dass Sie eine Funktion verwenden (Nicht- static data member initialisers), die nur in C++ 11 (und höher) existieren.

Die Lösung des Problems:

  • Sie können einfach Ihren Code mit -std=c++11 Flag kompilieren.
  • Alternativ können Sie diese Funktion vermeiden, wenn Sie aus irgendeinem Grund mit einem älteren Standard (z. B. C++ 98) arbeiten möchten (z. B. wenn Sie auf ein System abzielen, auf dem kein C++ 11-Compiler verfügbar ist).

Sollte mich das interessieren?

Absolut, ja. Das Nichtbeachten von Warnungen kann zu vielen Problemen wie Überläufen und undefiniertem Verhalten führen.

+0

Ich wusste nichts über die -std = C++ 11 Flagge, ich werde es definitiv benutzen! Vielen Dank! –

3

Immer Vorsicht wegen Warnungen! Warnungen sind nützlich, in der Tat sollten Sie immer mit -Werror kompilieren.

Es Sie warnt, dass Sie in Pre-C++ 11 kompilieren, sind aber unter Verwendung von C++ 11-Klasse initializers im Code:

struct foo { 
    int i = 0; // initialization of non-static POD 
}; 

Sie werden mit -std=c++11 kompilieren oder beenden Sie die Verwendung dieser Funktion und initialisieren Sie die Datenelemente im Konstruktor.

Verwandte Themen