2010-08-30 13 views
9

Ich versuche nur zu überprüfen, ob Compiler Typname als Variablennamen erlaubt. Wenn ichWarum String String erlaubt ist und Int Int vom Compiler nicht erlaubt ist?

int int; 
versucht

Es hat einen Fehler gemeldet sagen

Fehler C2632: 'int', gefolgt von 'int' ist illegal

Aber als ich versuchte,

#include <string> 
using namespace std; 

int main() 
{ 
    string string; 
} 

Es gab keinen Fehler. Sowohl string als auch int sind Datentypen.

Warum Compiler erlaubt string und erlaubt nicht int?

EDIT: enthält aktualisiert.

EDIT: Manche Leute sagen, Int ist keine Klasse. In diesem Fall, warum unterhalb der Linie ist erlaubt.

int a(10); 

es funktioniert ähnlich wie Konstruktor einer Klasse.

+0

was sind Ihre enthält? –

+7

Ich werde Leute mit mehr Erfahrung mit dem Standard diese Antwort geben, aber im Wesentlichen ist 'int' ein Schlüsselwort, während' string' eine Klasse ist. –

+1

Leider, da dies Hausaufgaben sind, sehe ich nicht, wie ich helfen kann, ohne die Antwort zu geben. Das heißt, ich denke, jeder Lehrer, der ein Problem wie dieses anordnet, muss eine Lektion über vernünftige Probleme für diejenigen von uns lernen, die keine Sprachanwälte sind. –

Antwort

22

string ist kein C++ reserved word, aber int ist, und ein reserviertes Wort kann nicht als Kennung verwendet werden.

Und es ist syntaktisch gut, Klassenname und Objektname zu haben, um gleich zu sein.

class test {}; 
int main() { 
     test test; // test is an object of type test. 
} 
+14

Hinweis: Perfekt, aber jeder Maintainer wird Sie umbringen, wenn Sie das wirklich machen code;) +1 –

+2

Diese Antwort ist korrekt, aber ich nehme das Problem mit "es ist in Ordnung, Klassenname und Objektnamen gleich zu haben". Der Standard mag es erlauben, aber es ist nicht sehr gut. –

+1

@ Bill und John: Zustimmen. – codaddict

3

int ist ein Schlüsselwort, während string der Name einer Klasse in der Standardbibliothek ist aber kein Schlüsselwort.

1

string ist eigentlich kein "Datentyp" im selben Sinne der int ist. int ist ein "nativer Typ" und als solcher ist der Text "int" ein Schlüsselwort.

string ist nur eine "benutzerdefinierte" Klasse (obwohl hier der "Benutzer" definiert ist es die C++ - Standards committete). Aber als solches ist "string" nicht ein Schlüsselwort.

Also int int ist zwei Schlüsselwörter zusammen, aber string string definiert nur eine Variable namens "Zeichenfolge" vom Typ "Zeichenfolge". Der C++ - Compiler kann die getrennten zwei Verwendungen von "string" aufrecht erhalten (aber es ist keine gute Idee, dies zu tun, da, wie Sie gezeigt haben, Programmierer dies oft nicht können).

6

int ist ein C++ - Schlüsselwort. In der zweiten Deklaration deklariert 'String-String' ein Objekt vom Typ 'std::string'. Danach wird der Name ‚string‘ 'std::string' in einem uneingeschränkten Lookup versteckt

#include <string> 
using std::string; 

int main(){ 
    string string; 

    string s; // Error 
} 
+0

Beachten Sie, dass die erste Verwendung ('string string') nur dann gültig ist, wenn' '' include' 'd ist und 'namespace std;' in der Datei vorhanden ist. –

+0

@BillyONeal: Oder 'using std :: string' :) – ereOn

+0

@ereOn: Guter Punkt :) –

0

Nun, da andere haben im Wesentlichen die Antwort geschrieben, ich werde weitermachen und nach, was bedeutete, dass ich ...

Ich nehme an, dass, weil die zweite Antwort kompiliert, dass Sie using namespace std; in Ihrer Datei haben (was im Allgemeinen keine gute Idee ist; ich verstehe nicht, warum Leute beginnen C++ - Benutzer dies zu tun). Wenn der Compiler das erste string auflösen will, kann er die Klasse im Namespace std finden. Die zweite Verwendung von string ist einfach der Name der Variablen.

0

Der Compiler erlaubt primitiven Typen, sich wie Klassen für die Zwecke von Vorlagen zu verhalten - wenn Sie sich für Primitive überall spezialisieren mussten, wäre es ein Albtraum.

Verwandte Themen