¿Qué es un error de 'identificador no declarado' y cómo lo soluciono?
¿Qué son los errores de identificador no declarados? ¿Cuáles son las causas comunes y cómo las soluciono?
Textos de error de ejemplo:
- Para el compilador de Visual Studio:
error C2065: 'cout' : undeclared identifier
- Para el compilador GCC:
'cout' undeclared (first use in this function)
La mayoría de las veces provienen de olvidar incluir el archivo de encabezado que contiene la declaración de la función; por ejemplo, este programa dará un error de 'identificador no declarado':
encabezado faltante
int main() {
std::cout << "Hello world!" << std::endl;
return 0;
}
Para solucionarlo debemos incluir el encabezado:
#include <iostream>
int main() {
std::cout << "Hello world!" << std::endl;
return 0;
}
Si escribió el encabezado y lo incluyó correctamente, es posible que el encabezado contenga el protector de inclusión incorrecto .
Para leer más, consulte http://msdn.microsoft.com/en-us/library/aa229215(v=vs.60).aspx .
variable mal escrita
Otra fuente común de error de principiante ocurre cuando escribes mal una variable:
int main() {
int aComplicatedName;
AComplicatedName = 1; /* mind the uppercase A */
return 0;
}
Alcance incorrecto
Por ejemplo, este código daría un error porque necesitas usar std::string
:
#include <string>
int main() {
std::string s1 = "Hello"; // Correct.
string s2 = "world"; // WRONG - would give error.
}
Usar antes de la declaración
void f() { g(); }
void g() { }
g
no ha sido declarado antes de su primer uso. Para solucionarlo, mueva la definición de g
antes f
:
void g() { }
void f() { g(); }
O agregue una declaración de g
antes f
:
void g(); // declaration
void f() { g(); }
void g() { } // definition
stdafx.h no está en la parte superior (específico de VS)
Esto es específico de Visual Studio. En VS, debes agregar #include "stdafx.h"
antes de cualquier código. El compilador ignora el código anterior, por lo que si tiene esto:
#include <iostream>
#include "stdafx.h"
Sería #include <iostream>
ignorado. Necesitas moverlo a continuación:
#include "stdafx.h"
#include <iostream>
No dudes en editar esta respuesta.
Considere una situación similar en una conversación. Imagina que tu amigo te dice: "Bob vendrá a cenar" y no tienes idea de quién es Bob. Vas a estar confundido, ¿verdad? Tu amigo debería haber dicho: "Tengo un colega de trabajo llamado Bob. Bob vendrá a cenar". Ahora Bob ha sido declarado y sabes de quién está hablando tu amigo.
El compilador emite un error de 'identificador no declarado' cuando has intentado utilizar algún identificador (cuál sería el nombre de una función, variable, clase, etc.) y el compilador no ha visto una declaración para ello. Es decir, el compilador no tiene idea de a qué te refieres porque no lo ha visto antes.
Si recibe un error de este tipo en C o C++, significa que no le ha informado al compilador sobre lo que está intentando utilizar. Las declaraciones a menudo se encuentran en archivos de encabezado, por lo que probablemente significa que no ha incluido el encabezado apropiado. Por supuesto, es posible que simplemente no te hayas acordado de declarar la entidad en absoluto.
Algunos compiladores dan errores más específicos según el contexto. Por ejemplo, intentar compilar X x;
donde el tipo X
no ha sido declarado con clang le indicará "nombre de tipo desconocido X
". Esto es mucho más útil porque sabes que está intentando interpretarse X
como un tipo. Sin embargo, si tiene int x = y;
, donde y
aún no está declarado, le indicará "uso de identificador no declarado y
" porque existe cierta ambigüedad sobre lo que y
podría representar exactamente.
En C y C++ todos los nombres deben declararse antes de usarse. Si intenta utilizar el nombre de una variable o una función que no ha sido declarada, obtendrá un error de "identificador no declarado".
Sin embargo, las funciones son un caso especial en C (y sólo en C) en el sentido de que no es necesario declararlas primero. El compilador de C asumirá que la función existe con el número y tipo de argumentos como en la llamada. Si la definición de función real no coincide, obtendrá otro error. Este caso especial para funciones no existe en C++.
Este tipo de errores se corrigen asegurándose de que las funciones y variables se declaren antes de usarse. En el caso de printf
que necesite incluir el archivo de encabezado <stdio.h>
(o <cstdio>
en C++).
Para funciones estándar, le recomiendo que consulte, por ejemplo , este sitio de referencia y busque las funciones que desea utilizar. La documentación de cada función le indica qué archivo de encabezado necesita.