2016-04-18 16 views
0

Nach dem Lösen von this simple issue musste ich fragen:Warum muss man den const specifier zur Definitionszeit wiederholen, wenn const anderswo deklariert wird?

-> In der H-Datei in einer Klasse ex ein const statische Mitglied definiert ist, z. :

class ex { 
    const static int my_ex; 
}; 

-> In der CPP-Datei den Wert

angegeben
ex::my_ex = 32; 

Und dann bekommt man den Fehler "widersprüchliche Erklärungen" (sowie "keine Art Name"). Ich verstehe, dass die Definition in der CPP-Datei ist auch eine Erklärung, die einen Konflikt aus dem Linker aber warum nur über die const Spezifizierer (und Typen) und nicht die statischen gesehen schaffen? Ich muss nur

const int ex::my_ex = 32; 

schreiben, um es zu kompilieren. Aber nicht statisch ... Warum nicht? Warum kann ich nicht einfach definieren und nicht wiederholen Deklaration verwandte Schritte (Typ, spezifische Kennungen)?

+1

'statisch' wird nie für Definitionen verwendet. –

+0

Ok ... aber ** warum ** ist wirklich meine Frage ... –

+0

Statisch in der Deklaration und statisch in der Definition bedeuten unterschiedliche Sache. – SergeyA

Antwort

6

Dies ist eine historische Sache.

Da C, static auf eine Definition bedeutet "interne Verknüpfung". Als C++ kam und Klassen hinzugefügt wurden, benötigte Bjarne ein Schlüsselwort, um statische Mitglieder zu bezeichnen. Da er keine neuen Schlüsselwörter hinzufügen wollte (eine Präferenz, die bis heute weitgehend existiert), verwendete er stattdessen static.

Jetzt bedeutete static zwei verschiedene Dinge, je nachdem, wo Sie es hinstellen. Also du kann nicht schreiben static hier, weil es etwas anderes bedeuten würde. Also verlangt die Sprache nicht, dass Sie das tun, denn das wäre albern.

Darüber hinaus ist . Wenn Sie eine Sprache erstellen, gleichen Sie die Einfachheit der Spezifikation gegen die Einfachheit der Implementierung und die Einfachheit der Verwendung aus, und Sie erhalten eine Reihe von Regeln, die die Sprache sind. Irgendwann musst du aufhören, über "Warum" einige unbedeutende Regel erstellt wurde und einfach mit dem Schreiben Ihres Programms weitermachen.