Τι είναι τα σφάλματα μη δηλωμένου αναγνωριστικού; Ποιες είναι οι συνήθεις αιτίες και πώς μπορώ να τα διορθώσω;
Παράδειγμα κειμένων σφάλματος:
Σφάλμα C2065: 'cout' : αδήλωτο αναγνωριστικό
.'cout' undeclared (πρώτη χρήση σε αυτή τη συνάρτηση)
Τις περισσότερες φορές προέρχονται από το γεγονός ότι ξεχνάτε να συμπεριλάβετε το αρχείο κεφαλίδας που περιέχει τη δήλωση της συνάρτησης, για παράδειγμα, αυτό το πρόγραμμα θα δώσει ένα σφάλμα 'undeclared identifier':
int main() {
std::cout << "Hello world!" << std::endl;
return 0;
}
Για να το διορθώσουμε, πρέπει να συμπεριλάβουμε την επικεφαλίδα:
#include <iostream>
int main() {
std::cout << "Hello world!" << std::endl;
return 0;
}
Αν γράψατε την επικεφαλίδα και την συμπεριλάβατε σωστά, η επικεφαλίδα μπορεί να περιέχει το λάθος include guard.
Για να διαβάσετε περισσότερα, ανατρέξτε στη διεύθυνση http://msdn.microsoft.com/en-us/library/aa229215(v=vs.60).aspx.
Μια άλλη συχνή πηγή λάθους αρχάριων's συμβαίνει όταν γράφετε λάθος μια μεταβλητή:
int main() {
int aComplicatedName;
AComplicatedName = 1; /* mind the uppercase A */
return 0;
}
Για παράδειγμα, αυτός ο κώδικας θα έδινε σφάλμα, επειδή πρέπει να χρησιμοποιήσετε το std::string
:
#include <string>
int main() {
std::string s1 = "Hello"; // Correct.
string s2 = "world"; // WRONG - would give error.
}
void f() { g(); }
void g() { }
Το g
δεν έχει δηλωθεί πριν από την πρώτη του χρήση. Για να το διορθώσετε, είτε μετακινήστε τον ορισμό του g
πριν από το f
:
void g() { }
void f() { g(); }
Ή προσθέστε μια δήλωση του g
πριν από το f
:
void g(); // declaration
void f() { g(); }
void g() { } // definition
Αυτό είναι ειδικό για το Visual Studio. Στο VS, πρέπει να προσθέσετε το #include "stdafx.h"
πριν από κάθε κώδικα. Ο κώδικας πριν από αυτό αγνοείται από τον μεταγλωττιστή, οπότε αν έχετε αυτό:
#include <iostream>
#include "stdafx.h"
Το #include <iostream>
θα αγνοηθεί. Πρέπει να το μετακινήσετε παρακάτω:
#include "stdafx.h"
#include <iostream>
Μπορείτε ελεύθερα να επεξεργαστείτε αυτή την απάντηση.</sub>,
Στη C και τη C++ όλα τα ονόματα πρέπει να δηλωθούν πριν χρησιμοποιηθούν. Αν προσπαθήσετε να χρησιμοποιήσετε το όνομα μιας μεταβλητής ή μιας συνάρτησης που δεν έχει δηλωθεί, θα λάβετε ένα σφάλμα "undeclared identifier".
Ωστόσο, οι συναρτήσεις είναι μια ειδική περίπτωση στη C (και μόνο στη C) στο ότι δεν χρειάζεται να τις δηλώσετε πρώτα. Ο μεταγλωττιστής της C θα υποθέσει ότι η συνάρτηση υπάρχει με τον αριθμό και τον τύπο των ορίων όπως στην κλήση. Εάν ο πραγματικός ορισμός της συνάρτησης δεν ταιριάζει με αυτό, θα λάβετε ένα άλλο σφάλμα. Αυτή η ειδική περίπτωση για τις συναρτήσεις δεν υπάρχει στη C++.
Διορθώνετε αυτού του είδους τα σφάλματα φροντίζοντας να δηλώνετε τις συναρτήσεις και τις μεταβλητές πριν τις χρησιμοποιήσετε. Στην περίπτωση της printf
πρέπει να συμπεριλάβετε το αρχείο κεφαλίδας <stdio.h>
(ή <cstdio>
στη C++).
Για τις τυποποιημένες συναρτήσεις, σας συνιστώ να ελέγξετε π.χ. αυτή την ιστοσελίδα αναφοράς, και να αναζητήσετε τις συναρτήσεις που θέλετε να χρησιμοποιήσετε. Η τεκμηρίωση για κάθε συνάρτηση σας λέει ποιο αρχείο κεφαλίδας χρειάζεστε.
Είναι σαν να χρησιμοποιείτε τη συνάρτηση χωρίς να τη δηλώνετε.Το αρχείο κεφαλίδας <stdio.h> θα περιέχει την συνάρτηση printf(). Συμπεριλάβετε το αρχείο κεφαλίδας στο πρόγραμμά σας αυτή είναι η λύση για αυτό. Ορισμένες συναρτήσεις που ορίζονται από το χρήστη μπορεί επίσης να προκαλέσουν σφάλμα όταν δεν δηλώνονται πριν από τη χρήση τους. Εάν χρησιμοποιείται συνολικά, δεν υπάρχουν προβλήματα.