Heim > Backend-Entwicklung > C++ > Warum erhalte ich einen Linker-Fehler, wenn ich statische Const-Integer-Mitglieder in einer C-Klasse definiere?

Warum erhalte ich einen Linker-Fehler, wenn ich statische Const-Integer-Mitglieder in einer C-Klasse definiere?

Linda Hamilton
Freigeben: 2024-12-01 13:14:09
Original
277 Leute haben es durchsucht

Why Do I Get a Linker Error When Defining Static Const Integer Members in a C   Class?

Linker-Fehler beim Definieren statischer Const-Integer-Mitglieder in der Klassendefinition

Klassendeklarationen in C ermöglichen die Definition von statischen Const-Integer-Mitgliedern innerhalb der Klasse. Allerdings können Benutzer bei Code, der dem bereitgestellten Beispiel ähnelt, auf Linkerfehler stoßen:

class test {
public:
    static const int N = 10;
};

int main() {
    std::cout << test::N << "\n";
    std::min(9, test::N);
}
Nach dem Login kopieren

Während der Compiler die Klassendefinition akzeptiert, meldet der Linker einen undefinierten Verweis auf test::N. Das Problem entsteht, weil die Deklaration in der Klasse keine echte Definition ist.

In C müssen statische const-Integralmitglieder außerhalb der Klasse in einem Namespace-Bereich definiert werden. Dies liegt daran, dass sie gemäß dem C-Standard (9.4.2/4) nicht innerhalb der Klassendeklaration initialisiert werden können:

Wenn ein statisches Datenelement vom Typ const integral oder const enumeration ist, erfolgt seine Deklaration in der Klassendefinition kann einen Konstanteninitialisierer angeben [...] In diesem Fall kann das Mitglied in ganzzahligen Konstantenausdrücken erscheinen. Das Mitglied muss weiterhin in einem Namespace-Bereich definiert sein, wenn es im Programm verwendet wird, und die Definition des Namespace-Bereichs darf keinen Initialisierer enthalten.

Um den Linkerfehler zu beheben, kann man das statische const-Mitglied außerhalb der Klasse definieren , normalerweise in der entsprechenden Quelldatei:

const int test::N = 10;
Nach dem Login kopieren

Alternativ kann für C 11 und höher das Schlüsselwort constexpr verwendet werden, um eine echte Definition innerhalb der Klasse zu erstellen Erklärung:

class test {
public:
    static constexpr int N = 10;
};
Nach dem Login kopieren

Das obige ist der detaillierte Inhalt vonWarum erhalte ich einen Linker-Fehler, wenn ich statische Const-Integer-Mitglieder in einer C-Klasse definiere?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage