2010-08-30 15 views
9

Solo estoy tratando de verificar si el compilador permite el nombre del tipo como nombre de la variable. Cuando he intentado¿Por qué se permite la cadena de caracteres y el compilador no permite int int?

int int; 

Se informa de un error diciendo

C2632 de error: 'int' seguido de 'int' es ilegal

Pero cuando he intentado

#include <string> 
using namespace std; 

int main() 
{ 
    string string; 
} 

No dio ningún error. Ambos string y int son tipos de datos.

¿Por qué el compilador permite string y no permite int?

EDITAR: incluye actualización.

EDITAR: Algunas personas dicen que int no es una clase. En ese caso, ¿por qué se permite la línea inferior?

int a(10); 

funciona similar al constructor de una clase.

+0

¿Cuáles son sus incluye? –

+7

Dejaré que las personas con más experiencia con el estándar respondan a esta, pero esencialmente, 'int' es una palabra clave, mientras' string' es una clase. –

+1

Desafortunadamente, como esto es tarea, no veo cómo puedo ayudar sin dar la respuesta. Dicho esto, creo que cualquier instructor que asigne un problema como este necesita aprender una lección sobre problemas razonables para aquellos de nosotros que no somos abogados de idiomas. –

Respuesta

22

string no es un C++ reserved word, pero int es, y una palabra reservada no se puede utilizar como un identificador.

Y su sintácticamente bien para que el nombre de la clase y el nombre del objeto sean los mismos.

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

Nota: Perfectamente bien, pero cualquier mantenedor va a ** matar ** si haces esto en real código;) +1 –

+2

Esta respuesta es correcta, pero no estoy de acuerdo con "está bien tener el nombre de la clase y el nombre del objeto para ser el mismo". El estándar puede permitirlo, pero no está "bien". –

+1

@ Bill y John: De acuerdo. – codaddict

3

int es una palabra clave, mientras que string es el nombre de una clase en la biblioteca estándar, pero no es una palabra clave.

1

string no es realmente un "tipo de datos" en el mismo sentido que el int es. int es un "tipo nativo" y, como tal, el texto "int" es una palabra clave.

string es solo una clase "definida por el usuario" (aunque, aquí el "usuario" definido es el comité de estándares de C++). Pero como tal, "cadena" es no una palabra clave.

Así que int int son dos palabras clave juntas, pero string string está definiendo un varaible llamado "cadena" de tipo "cadena". El compilador de C++ puede mantener los dos usos de "cadena" por separado (pero no es una buena idea hacer esto, ya que, como ha demostrado, los programadores a menudo no pueden).

6

int es una palabra clave en C++. En la segunda declaración 'string string' declara un objeto del tipo 'std::string'. Después de esto el nombre de 'cadena' se esconde 'std::string' en una búsqueda sin reservas

#include <string> 
using std::string; 

int main(){ 
    string string; 

    string s; // Error 
} 
+0

Tenga en cuenta que el primer uso ('string string') solo es válido si' 'es' # include' 'd y 'using namespace std;' está presente en el archivo. –

+0

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

+0

@ereOn: Buen punto :) –

0

Bueno, teniendo en cuenta que otros han publicado esencialmente la respuesta, voy a seguir adelante y publicar lo que quería decir ...

Supongo que debido a que compila la segunda respuesta, tiene using namespace std; en su archivo (que en general no es una buena idea; no veo por qué la gente le dice a los usuarios de C++ que comiencen esto).

Cuando el compilador va a resolver el primer string, puede encontrar la clase en el espacio de nombres std. El segundo uso de string es simplemente el nombre de la variable.

0

El compilador permite que los tipos primitivos se comporten como clases con el propósito de plantillas; si tuviera que especializarse para primitivos en todas partes, sería una pesadilla.

Cuestiones relacionadas