Что такое ошибка "необъявленного идентификатора" и как его исправить?
Что такое необъявленные ошибки идентификатора? Каковы общие причины и как их исправить?
Примеры текстов ошибок:
- Для компилятора Visual Studio:
error C2065: 'printf' : undeclared identifier
- Для компилятора GCC:
`printf' undeclared (first use in this function)
Ответы
Ответ 1
Они чаще всего приходят из забывания включить заголовочный файл, содержащий объявление функции, например, эта программа даст ошибку "необъявленного идентификатора":
Отсутствует заголовок
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.
Неверная переменная
Другой распространенный источник ошибки начинающего возникает, когда вы ошибочно написали переменную:
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
Не стесняйтесь редактировать этот ответ.
Ответ 2
Рассмотрим аналогичную ситуацию в разговоре. Представьте, что ваш друг говорит вам: "Боб подходит к обеду", и вы не знаете, кто такой Боб. Вы будете в замешательстве, верно? Ваш друг должен был сказать: "У меня есть коллега по работе по имени Боб. Боб подходит к обеду". Теперь Боб был объявлен, и вы знаете, о чём говорит ваш друг.
Компилятор испускает ошибку "необъявленного идентификатора", когда вы пытаетесь использовать какой-то идентификатор (что будет именем функции, переменной, класса и т.д.), и компилятор не видел для него объявления. То есть, компилятор понятия не имеет, о чем вы говорите, потому что раньше этого не видел.
Если вы получаете такую ошибку в C или С++, это означает, что вы не сказали компилятору о том, что вы пытаетесь использовать. Объявления часто встречаются в заголовочных файлах, поэтому, вероятно, это означает, что вы не включили соответствующий заголовок. Конечно, возможно, вы просто не помнили, чтобы вообще объявлять сущность.
Некоторые компиляторы дают более конкретные ошибки в зависимости от контекста. Например, попытка скомпилировать X x;
, где тип X
не был объявлен с clang, скажет вам "неизвестное имя типа X
". Это гораздо более полезно, потому что вы знаете, что пытаетесь интерпретировать X
как тип. Однако, если у вас есть int x = y;
, где y
еще не объявлен, он скажет вам "использование незаявленного идентификатора y
", потому что существует некоторая неопределенность в отношении того, что может представлять собой y
.
Ответ 3
В C и С++ все имена должны быть объявлены до их использования. Если вы попытаетесь использовать имя переменной или функцию, которая не была объявлена, вы получите ошибку "необъявленный идентификатор".
Однако функции являются частным случаем в C (и только в C), поскольку вам не нужно сначала объявлять их. Компилятор C будет считать, что функция существует с количеством и типом аргументов, как в вызове. Если фактическое определение функции не соответствует, вы получите еще одну ошибку. Этот специальный случай для функций не существует в С++.
Вы исправляете эти ошибки, убедившись, что функции и переменные объявлены до их использования. В случае printf
вам нужно включить заголовочный файл <stdio.h>
(или <cstdio>
в С++).
Для стандартных функций я рекомендую вам проверить, например. этот справочный сайт и выполните поиск функций, которые вы хотите использовать. Документация для каждой функции сообщает вам, какой файл заголовка вам нужен.
Ответ 4
Эти сообщения об ошибках
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>
в С++, и помещается в стандартную (std::
) и глобальную (::
) ( не обязательно) пространства имен.
Поэтому перед использованием этой функции мы должны предоставить объявление своего имени компилятору, включив соответствующие заголовки.
Например
С
#include <stdio.h>
int main( void )
{
printf( "Hello World\n" );
}
С++:
#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
строчной буквой "p".
#include <cstdio>
void PrintHello()
{
std::printf( "Hello World\n" );
}
int main()
{
printHello();
}
В этом случае компилятор выдает такую ошибку, потому что не видит объявления имени PrintHello
. PrintHello
и PrintHello
- это два разных имени, одно из которых было объявлено, а другое не было объявлено, а использовано в теле основного
Ответ 5
У меня была та же проблема с пользовательским классом, который был определен в пространстве имен. Я попытался использовать класс без пространства имен, в результате чего ошибка "идентификатор" компилятора MyClass "undefined".
Добавление
using namespace <MyNamespace>
или используя класс, подобный
MyNamespace::MyClass myClass;
решил проблему.
Ответ 6
Это похоже на использование функции без объявления ее. заголовочный файл будет содержать
функция printf(). Включите файл заголовка в свою программу, это решение для этого.
Некоторые пользовательские функции также могут быть вызваны ошибкой, если они не были объявлены перед использованием. Если
он используется глобально без проблем.
Ответ 7
Каждая необъявленная переменная в ошибке c возникает из-за того, что компилятор не может найти ее в проекте. Можно включить внешний (заголовочный) файл библиотеки, в которой определена переменная. Следовательно, в вашем вопросе вам требуется <stdio.h>
, который является стандартным входным выходным файлом, который описывает функции printf(),
Ответ 8
Проверьте, импортируете ли вы те же пакеты в своем .m и в своем .h
Пример: у меня была эта проблема с методом init, и это было вызвано отсутствием "#import" в .m файле