Что такое необъявленные ошибки идентификатора? Каковы общие причины и как их исправить?
Пример текстов ошибок:
error C2065: 'cout' : undeclared identifier
'cout' undeclared (first use in this function)
Чаще всего они приходят из-за того, что забывают включить заголовочный файл, содержащий объявление функции, например, эта программа выдаст ошибку «необъявленный идентификатор»:
int main() {
std::cout << "Hello world!" << std::endl;
return 0;
}
Чтобы это исправить, мы должны включить заголовок:
#include <iostream>
int main() {
std::cout << "Hello world!" << std::endl;
return 0;
}
Если вы написали заголовок и включили его правильно, заголовок может содержать неправильный включить охрану.
Чтобы узнать больше, смотрите http://msdn.microsoft.com/en-us/library/aa229215(v=vs.60).aspx.
Другой распространенный источник ошибки новичка возникает, когда вы неправильно написали переменную:
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>
Не стесняйтесь редактировать этот ответ.
Рассмотрим похожую ситуацию в разговоре. Представьте, что ваш друг говорит вам: «Боб идет на ужин», а ты не представляешь, кто такой Боб. Вы будете в замешательстве, верно? Твой друг должен был сказать: «У меня есть коллега по работе по имени Боб. Боб подходит к обеду». Теперь Боб объявлен, и вы знаете, о ком говорит ваш друг.
Компилятор выдает ошибку «необъявленный идентификатор», когда вы пытаетесь использовать какой-то идентификатор (который будет именем функции, переменной, класса и т. Д.), И компилятор не видит объявления для него. То есть компилятор понятия не имеет, о чем вы говорите, потому что раньше его не видел.
Если вы получаете такую ошибку в C или C ++, это означает, что вы не сказали компилятору о том, что вы пытаетесь использовать. Объявления часто встречаются в заголовочных файлах, поэтому, скорее всего, это означает, что вы не включили соответствующий заголовок. Конечно, может случиться так, что вы просто не помните, чтобы объявить сущность вообще.
Некоторые компиляторы выдают более конкретные ошибки в зависимости от контекста. Например, пытаясь скомпилировать X x;
где тип X
не был объявлен с Clang скажет вам «неизвестное имя типа X
«. Это гораздо полезнее, потому что вы знаете, что он пытается интерпретировать X
как тип. Тем не менее, если у вас есть int x = y;
, где y
еще не объявлено, он скажет вам «использование необъявленного идентификатора y
«потому что есть некоторая двусмысленность в том, что именно y
может представлять.
У меня была такая же проблема с пользовательским классом, который был определен в пространстве имен. Я пытался использовать класс без пространства имен, вызывая ошибку компилятора «идентификатор» MyClass «не определен».
Добавление
using namespace <MyNamespace>
или используя класс, как
MyNamespace::MyClass myClass;
решил проблему.
В C и C ++ все имена должны быть объявлены перед использованием. Если вы попытаетесь использовать имя переменной или функции, которая не была объявлена, вы получите ошибку «необъявленный идентификатор».
Однако функции — это особый случай в C (и только в C), в котором вам не нужно сначала объявлять их. Компилятор C будет предполагать, что функция существует с числом и типом аргументов, как в вызове. Если фактическое определение функции не совпадает, вы получите еще одну ошибку. Этот особый случай для функций не существует в C ++.
Вы исправляете ошибки такого рода, проверяя, что функции и переменные объявлены до их использования. В случае printf
вам нужно включить заголовочный файл <stdio.h>
(или же <cstdio>
в C ++).
Для стандартных функций я рекомендую вам проверить, например, этот справочный сайт, и найдите функции, которые вы хотите использовать. Документация для каждой функции говорит вам, какой заголовочный файл вам нужен.
Эти сообщения об ошибках
1.For the Visual Studio compiler: error C2065: 'printf' : undeclared identifier
2.For the GCC compiler: `printf' undeclared (first use in this function)
означает, что вы используете имя printf
но компилятор не видит, где было объявлено имя, и, соответственно, не знает, что это значит.
Любое имя, используемое в программе, должно быть объявлено до ее использования. Компилятор должен знать, что обозначает имя.
В этом конкретном случае компилятор не видит объявление имени printf
, Как мы знаем (но не компилятор) это имя стандартной функции C, объявленной в заголовке <stdio.h>
в C или в заголовке <cstdio>
в C ++ и размещены в стандарте (std::
) и глобальный (::
) (не обязательно) пространства имен.
Поэтому, прежде чем использовать эту функцию, мы должны предоставить объявление ее имени компилятору путем включения соответствующих заголовков.
Например
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" );
}
Иногда причиной такой ошибки является простая опечатка. Например, давайте предположим, что вы определили функцию PrintHello
void PrintHello()
{
std::printf( "Hello World\n" );
}
но в основном вы сделали опечатку и вместо PrintHello
ты напечатал printHello
с строчной буквы «р».
#include <cstdio>
void PrintHello()
{
std::printf( "Hello World\n" );
}
int main()
{
printHello();
}
В этом случае компилятор выдаст такую ошибку, потому что он не видит объявление имени printHello
, PrintHello
а также printHello
два разных имени, одно из которых было объявлено, а другое не объявлено, но используется в теле основного
Другая возможная ситуация: доступ к родительскому элементу (классу шаблона) в классе шаблона.
Исправить метод: использование родительского члена класса по его полному имени (с помощью префикса this->
или же parentClassName::
на имя члена).
увидеть: шаблоны: переменные-члены родительского класса не видны в унаследованном классе
Это похоже на использование функции без ее объявления. заголовочный файл будет содержать
функция printf (). Включите заголовочный файл в вашу программу, это решение для этого.
Некоторые пользовательские функции могут также вызывать ошибки, если они не были объявлены перед использованием. Если
это используется во всем мире без проб.
В большинстве случаев, если вы уверены, что импортировали данную библиотеку, Visual Studio поможет вам с IntelliSense.
Вот что сработало для меня:
Удостоверься что #include "stdafx.h"
объявляется первым, то есть вверху всех ваших включений.