[C++] Che cos'è un errore di "identificatore non dichiarato" e come risolverlo?


Answers

Considera una situazione simile nella conversazione. Immagina che il tuo amico ti dica: "Bob sta arrivando per cena" e non hai idea di chi sia Bob. Sarai confuso, giusto? Il tuo amico avrebbe dovuto dire: "Ho un collega di lavoro che si chiama Bob. Bob sta venendo a cena". Ora Bob è stato dichiarato e tu sai di chi sta parlando il tuo amico.

Il compilatore emette un errore di "identificatore non dichiarato" quando si è tentato di utilizzare un identificatore (quale sarebbe il nome di una funzione, variabile, classe, ecc.) E il compilatore non ha visto una dichiarazione per questo. Cioè, il compilatore non ha idea di cosa ti stai riferendo perché non l'ha visto prima.

Se ottieni un tale errore in C o C ++, significa che non hai detto al compilatore cosa stai cercando di usare. Le dichiarazioni si trovano spesso nei file di intestazione, quindi probabilmente significa che non hai incluso l'intestazione appropriata. Certo, può darsi che tu non abbia ricordato di dichiarare l'entità.

Alcuni compilatori danno errori più specifici a seconda del contesto. Ad esempio, tentando di compilare X x; dove il tipo X non è stato dichiarato con clang ti dirà "nome tipo sconosciuto X ". Questo è molto più utile perché sai che sta cercando di interpretare X come un tipo. Tuttavia, se hai int x = y; , dove y non è stato ancora dichiarato, ti dirà "uso dell'identificatore non dichiarato y " perché c'è qualche ambiguità su cosa esattamente potrebbe rappresentare.

Question

Quali sono gli errori dell'identificatore non dichiarato? Quali sono le cause più comuni e come risolverle?

Esempi di testi di errore:

  • Per il compilatore di Visual Studio: error C2065: 'printf' : undeclared identifier
  • Per il compilatore GCC: `printf' undeclared (first use in this function)



Queste misure di errore

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

significa che usi il nome printf ma il compilatore non vede dove è stato dichiarato il nome e di conseguenza non sa cosa significhi.

Qualsiasi nome usato in un programma deve essere dichiarato prima del suo utilizzo. Il compilatore deve sapere che cosa il nome denota.

In questo caso particolare il compilatore non vede la dichiarazione di nome printf . Come sappiamo (ma non il compilatore) è il nome della funzione standard C dichiarata nell'intestazione <stdio.h> in C o nell'intestazione <cstdio> in C ++ e posta in standard ( std:: <cstdio> e globale ( :: <cstdio> (non necessariamente) spazi dei nomi.

Quindi, prima di utilizzare questa funzione, dobbiamo fornire la dichiarazione del nome al compilatore includendo le intestazioni corrispondenti.

Ad esempio 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" );
}

A volte la ragione di un tale errore è un semplice errore di battitura. Ad esempio, supponiamo di aver definito la funzione PrintHello

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

ma in main hai fatto un refuso e invece di PrintHello hai scritto printHello con la lettera minuscola 'p'.

#include <cstdio>

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

int main()
{
   printHello();
}

In questo caso il compilatore emetterà un errore di questo tipo perché non vede la dichiarazione di nome printHello . PrintHello e printHello sono due nomi diversi, uno dei quali è stato dichiarato e l'altro non è stato dichiarato ma utilizzato nel corpo principale




È come usare la funzione senza dichiararla. il file di intestazione conterrà la funzione printf (). Includere il file di intestazione nel programma questa è la soluzione per questo. Alcune funzioni definite dall'utente possono anche passare per errore se non dichiarate prima di usarlo. Se è usato globalmente, nessun problema.




Controlla se stai importando gli stessi pacchetti nel tuo .m e nel tuo .h Esempio dato: ho avuto questo problema con il metodo init ed è stato causato dalla mancanza di "#import" sul file .m