Heim >Backend-Entwicklung >C++ >Warum erhalte ich einen Linker-Fehler, wenn ich statische Const-Integer-Mitglieder in einer C-Klasse definiere?
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 <p>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.</p><p>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:</p><blockquote>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.</blockquote><p>Um den Linkerfehler zu beheben, kann man das statische const-Mitglied außerhalb der Klasse definieren , normalerweise in der entsprechenden Quelldatei:</p><pre class="brush:php;toolbar:false">const int test::N = 10;
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; };
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!