web-dev-qa-db-fra.com

Qu'est-ce qu'une erreur "identificateur non déclaré" et comment la corriger?

Quelles sont les erreurs d'identificateur non déclarées? Quelles sont les causes courantes et comment puis-je les résoudre?

Exemple de textes d'erreur:

  • Pour le compilateur Visual Studio: error C2065: 'cout' : undeclared identifier
  • Pour le compilateur GCC: 'cout' undeclared (first use in this function)
40
sashoalm

Ils viennent le plus souvent en oubliant d'inclure le fichier d'en-tête contenant la déclaration de la fonction. Par exemple, ce programme donnera une erreur 'identificateur non déclaré':

En-tête manquant

int main() {
    std::cout << "Hello world!" << std::endl;
    return 0;
}

Pour résoudre ce problème, nous devons inclure l'en-tête:

#include <iostream>
int main() {
    std::cout << "Hello world!" << std::endl;
    return 0;
}

Si vous avez écrit l'en-tête et que vous l'avez inclus correctement, l'en-tête peut contenir le mauvais include guard .

Pour en savoir plus, voir http://msdn.Microsoft.com/en-us/library/aa229215(v=vs.60).aspx .

Variable mal orthographiée

Une autre source courante d'erreur de débutant se produit lorsque vous avez mal orthographié une variable:

int main() {
    int aComplicatedName;
    AComplicatedName = 1;  /* mind the uppercase A */
    return 0;
}

Portée incorrecte

Par exemple, ce code donnerait une erreur, car vous devez utiliser std::string:

#include <string>

int main() {
    std::string s1 = "Hello"; // Correct.
    string s2 = "world"; // WRONG - would give error.
}

Utiliser avant déclaration

void f() { g(); }
void g() { }

g n'a pas été déclaré avant sa première utilisation. Pour résoudre ce problème, déplacez la définition de g avant f:

void g() { }
void f() { g(); }

Ou ajoutez une déclaration de g avant f:

void g(); // declaration
void f() { g(); }
void g() { } // definition

stdafx.h pas sur le dessus (spécifique au VS)

Ceci est spécifique à Visual Studio. Dans VS, vous devez ajouter #include "stdafx.h" avant tout code. Code avant qu’il soit ignoré par le compilateur, donc si vous avez ceci:

#include <iostream>
#include "stdafx.h"

Le #include <iostream> serait ignoré. Vous devez le déplacer ci-dessous:

#include "stdafx.h"
#include <iostream>

N'hésitez pas à éditer cette réponse.

57
sashoalm

Considérez une situation similaire dans une conversation. Imaginez que votre ami vous dise: "Bob vient dîner" et vous ne savez pas qui est Bob. Vous allez être confus, non? Votre ami aurait dû dire: "J'ai un collègue de travail appelé Bob. Bob vient dîner." Maintenant, Bob a été déclaré et vous savez de qui parle votre ami.

Le compilateur émet une erreur 'identificateur non déclaré' lorsque vous tentez d'utiliser un identificateur (quel serait le nom d'une fonction, d'une variable, d'une classe, etc.) et que le compilateur n'a pas vu de déclaration à cet effet. En d’autres termes, le compilateur n’a aucune idée de ce à quoi vous faites référence car il ne l’a jamais vu auparavant.

Si vous obtenez une telle erreur en C ou C++, cela signifie que vous n'avez pas informé le compilateur de ce que vous essayez d'utiliser. Les déclarations se trouvent souvent dans les fichiers d'en-tête, ce qui signifie probablement que vous n'avez pas inclus l'en-tête approprié. Bien sûr, il se peut que vous n’ayez tout simplement pas pensé à déclarer l’entité du tout.

Certains compilateurs donnent des erreurs plus spécifiques en fonction du contexte. Par exemple, si vous tentez de compiler X x; alors que le type X n'a pas été déclaré avec clang, vous obtiendrez un "nom de type inconnu X". Ceci est beaucoup plus utile car vous savez qu'il essaie d'interpréter X comme un type. Cependant, si vous avez int x = y;, où y n'est pas encore déclaré, le système vous indiquera "utilisation de l'identificateur non déclaré y", car il existe une ambiguïté sur ce que exactement y pourrait représenter.

12
Joseph Mansfield

J'ai eu le même problème avec une classe personnalisée, qui a été définie dans un espace de noms. J'ai essayé d'utiliser la classe sans l'espace de noms, provoquant l'erreur de compilation "l'identifiant" MyClass "n'est pas défini"

using namespace <MyNamespace>

ou en utilisant la classe comme

MyNamespace::MyClass myClass;

résolu le problème. 

5
Dimitar Dimitrov

En C et C++, tous les noms doivent être déclarés avant d'être utilisés. Si vous essayez d'utiliser le nom d'une variable ou d'une fonction qui n'a pas été déclarée, vous obtiendrez une erreur "identificateur non déclaré".

Cependant, les fonctions constituent un cas particulier en C (et en C seulement) en ce sens que vous n’avez pas à les déclarer au préalable. Le compilateur C supposera que la fonction existe avec le nombre et le type d'arguments comme dans l'appel. Si la définition de fonction réelle ne correspond pas, vous obtiendrez une autre erreur. Ce cas particulier pour les fonctions n'existe pas en C++.

Vous corrigez ce type d'erreur en vous assurant que les fonctions et les variables sont déclarées avant leur utilisation. Dans le cas de printf, vous devez inclure le fichier d’en-tête <stdio.h> (ou <cstdio> en C++).

Pour les fonctions standard, je vous recommande de vérifier par exemple ce site de référence , et recherchez les fonctions que vous souhaitez utiliser. La documentation de chaque fonction vous indique le fichier d’en-tête dont vous avez besoin.

4

Ces mesures d'erreur

1.For the Visual Studio compiler: error C2065: 'printf' : undeclared identifier
2.For the GCC compiler: `printf' undeclared (first use in this function)

cela signifie que vous utilisez name printf mais que le compilateur ne voit pas où le nom a été déclaré et ne sait donc pas ce que cela signifie.

Tout nom utilisé dans un programme doit être déclaré avant son utilisation. Le compilateur doit savoir ce que son nom indique.

Dans ce cas particulier, le compilateur ne voit pas la déclaration de nom printf. Comme nous le savons (mais pas le compilateur), il s'agit du nom de la fonction standard C déclarée dans l'en-tête <stdio.h> en C ou dans l'en-tête <cstdio> en C++ et placée dans les espaces de noms standard (std::) et global (::) (pas nécessairement).

Donc, avant d'utiliser cette fonction, nous devons fournir sa déclaration de nom au compilateur en incluant les en-têtes correspondants.

Par exemple C:

#include <stdio.h>

int main( void )
{
   printf( "Hello World\n" );
}

C++:

#include <cstdio>

int main()
{
   std::printf( "Hello World\n" );
   // or printf( "Hello World\n" );
   // or ::printf( "Hello World\n" );
}

Parfois, la raison d'une telle erreur est une simple faute de frappe. Par exemple, supposons que vous ayez défini la fonction PrintHello

void PrintHello()
{
    std::printf( "Hello World\n" );
}

mais en gros vous avez fait une faute de frappe et au lieu de PrintHello vous avez tapé printHello avec la lettre minuscule 'p'. 

#include <cstdio>

void PrintHello()
{
    std::printf( "Hello World\n" );
}

int main()
{
   printHello();
}

Dans ce cas, le compilateur émettra une telle erreur car il ne voit pas la déclaration de nom printHello. PrintHello et printHello sont deux noms différents dont l’un a été déclaré et l’autre n’a pas été déclaré mais utilisé dans le corps de

3
Vlad from Moscow

Autre situation possible: accéder au membre parent (une classe de modèle) dans une classe de modèle.

Méthode de correction: utiliser le membre de classe parent par son nom complet (en ajoutant le préfixe this-> ou parentClassName:: au nom du membre).

voir: templates: variables membres de la classe parent non visibles dans la classe héritée

1
phil

Toute variable non déclarée dans l'erreur c vient du fait que le compilateur n'est pas en mesure de la trouver dans le projet. On peut inclure le fichier externe (en-tête) de la bibliothèque dans laquelle la variable est définie. Par conséquent, dans votre question, vous avez besoin de <stdio.h>, qui est un fichier de sortie standard, décrivant la fonctionnalité printf ().

Selon documentation , la déclaration de fprintf () est dans le fichier, vous devez l’inclure avant d’utiliser la fonction.

0
Ishmeet

La plupart du temps, si vous êtes certain d'avoir importé la bibliothèque en question, Visual Studio vous guidera avec IntelliSense.

Voici ce qui a fonctionné pour moi:

Assurez-vous que #include "stdafx.h" est déclaré en premier, c’est-à-dire en haut de tous vos includes.

0
Declan Nnadozie

Un identifiant C++ est un nom utilisé pour identifier une variable, une fonction, une classe, un module ou tout autre élément défini par l'utilisateur. En C++, tous les noms doivent être déclarés avant d'être utilisés. Si vous essayez d'utiliser le nom d'un tel qui n'a pas été déclaré, vous obtiendrez une erreur de compilation "identificateur non déclaré".

Selon la documentation , la déclaration de printf () est dans cstdio, c'est-à-dire que vous devez l'inclure avant d'utiliser la fonction.

0
Amit G.

C'est comme utiliser la fonction sans la déclarer. Le fichier d'en-tête contiendra la function printf (). Inclure le fichier d'en-tête dans votre programme c'est la solution pour cela . Certaines fonctions définies par l'utilisateur peuvent également provoquer des erreurs lorsqu'elles ne sont pas déclarées avant d'être utilisées. Si , Il est utilisé globalement sans problème. 

0
Q_SaD