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); }
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;
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!