Подтвердить что ты не робот

Что такое ошибка "необъявленного идентификатора" и как его исправить?

Что такое необъявленные ошибки идентификатора? Каковы общие причины и как их исправить?

Примеры текстов ошибок:

  • Для компилятора Visual Studio: error C2065: 'printf' : undeclared identifier
  • Для компилятора GCC: `printf' undeclared (first use in this function)
4b9b3361

Ответ 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 файле