Heim >Backend-Entwicklung >C++ >Warum erhalte ich die Fehlermeldung „Undefinierte Referenz', wenn ich ein statisches constexpr char-Array in einer C-Klasse verwende?

Warum erhalte ich die Fehlermeldung „Undefinierte Referenz', wenn ich ein statisches constexpr char-Array in einer C-Klasse verwende?

Susan Sarandon
Susan SarandonOriginal
2024-12-19 14:13:10765Durchsuche

Why Do I Get an

Undefinierter Verweis auf statisches constexpr char[]

In C, wenn ein statisches const char-Array innerhalb einer Klasse deklariert und innerhalb eines verwendet wird Bei einer Member-Funktion kann es zu einem Fehler kommen, der auf eine undefinierte Referenz hinweist. Dieser Fehler entsteht aufgrund der Trennung zwischen Deklaration und Definition in statischen Elementen.

Problem

Betrachten Sie das folgende Beispiel:

// header file (foo.hpp)
struct Foo {
  void bar();
  static constexpr char baz[] = "qux";
};

// cpp file (foo.cpp)
void Foo::bar() {
  std::string str(baz); // undefined reference to baz
}

Hier Beispielsweise wird das statische const char-Array baz innerhalb der Klasse deklariert, aber nicht definiert. Das Kompilieren des Codes mit GCC führt zu dem Fehler „undefinierter Verweis auf baz“.

Lösung

Um dieses Problem zu beheben, müssen Sie eine Definition für die Statik bereitstellen Mitglied in der CPP-Datei. Diese Definition gibt den tatsächlichen Inhalt des Arrays an. Fügen Sie im obigen Beispiel die folgende Zeile zur CPP-Datei hinzu:

constexpr char Foo::baz[];

Explanation

In C erfordern statische Elemente sowohl eine Deklaration als auch eine Definition, die sind getrennte Einheiten. Die Deklaration gibt den Typ und den Namen des Mitglieds an, während die Definition seine tatsächliche Implementierung oder seinen tatsächlichen Wert bereitstellt.

Für statische Mitglieder, die innerhalb einer Klasse deklariert werden, erscheint die Deklaration normalerweise zusammen mit etwaigen Initialisierern in der Klassendefinition. Die Definition muss jedoch außerhalb der Klassendefinition bereitgestellt werden, normalerweise in einer separaten CPP-Datei oder am Ende der Klassendefinition.

Durch die Bereitstellung einer Definition für das statische Mitglied baz kann der Linker auflösen seine Referenz und generieren Sie den notwendigen Code. Ohne die Definition kann der Linker den tatsächlichen Inhalt des Arrays nicht ermitteln und führt zu einem undefinierten Referenzfehler.

Das obige ist der detaillierte Inhalt vonWarum erhalte ich die Fehlermeldung „Undefinierte Referenz', wenn ich ein statisches constexpr char-Array in einer C-Klasse verwende?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn