Какие ошибки необъявленный идентификатор? Каковы наиболее распространенные причины и способы их исправить?
Пример текста ошибки:
ошибка C2065: 'соиь' : необъявленный идентификатор
'соиь' незаявленных (первое использование в этой функции)
Они чаще всего приходят из забыв включить заголовочный файл, содержащий объявление функции, например, эта программа даст 'необъявленный идентификатор' ошибка:
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(в=против 60).аспн.
Другим распространенным источником новичок'ошибки происходят, когда вы неправильно написали переменной:
int main() {
int aComplicatedName;
AComplicatedName = 1; /* mind the uppercase A */
return 0;
}
Например, этот код даст ошибку, потому что вы должны использовать СТД::строка
:
#include <string>
int main() {
std::string s1 = "Hello"; // Correct.
string s2 = "world"; // WRONG - would give error.
}
void f() { g(); }
void g() { }
г
не был объявлен перед первым использованием. Чтобы удалить его, либо переместить определение г
до Ф
:
void g() { }
void f() { g(); }
Или добавьте объявление из G
до Ф
:
void g(); // declaration
void f() { g(); }
void g() { } // definition
Это визуальная студия-специфический. В vs, вам нужно добавить `#включить "в файл stdafx.ч" и перед любой код. Прежде чем он игнорируется компилятором, так что если у вас есть этот код:
#include <iostream>
#include "stdafx.h"
Символ #включить <библиотеки iostream>
будут игнорироваться. Вам нужно, чтобы переместить его ниже:
#include "stdafx.h"
#include <iostream>
<суб>не стесняйтесь редактировать этот ответ.</суб>
Рассмотрим аналогичную ситуацию в разговоре. Представьте, что ваш друг говорит вам: "не придет Боб на ужин" и ты даже не представляешь, Боб. Вы'ре собирается путать, верно? Ваш друг должен был сказать: "У меня есть коллега по работе по имени Боб. Боб приезжает на ужин." и теперь Боб был объявлен и вы знаете, кто ваш друг говорить.
Компилятор выдает 'необъявленный идентификатор' ошибка, когда вы пытались использовать некоторые идентификатор (что бы быть имя функции, переменной, класса и т. д.) и компилятор не видит объявление для него. То есть, компилятор не имеет понятия, что вы имеете в виду, потому что она'т видел его раньше.
Если вы получаете такие ошибки в C или C++, это означает, что вы не'т сказали компилятору о том, что вы пытаетесь использовать. Объявления часто встречаются в заголовочных файлах, так что, вероятно, означает, что вы не'т включен соответствующий заголовок. Конечно, это может быть, что вы просто не'т вспомнил объявить лицо на всех.
Некоторые компиляторы дают более конкретные ошибки в зависимости от контекста. Например, при попытке компиляции Х Х
, где тип х
не был объявлен с лязгом скажу тебя "неизвестное имя типа Х в
". Это гораздо полезнее, потому что вы это знаете'ы пытались интерпретировать х
в качестве типа. Однако, если у вас есть тип int х = г;, где
Yявляется еще не объявлен, он скажет вам, что "использование необъявленный идентификатор
г в" потому что есть некоторая неясность, о каком именно
м` может представлять.
У меня была такая же проблема с пользовательского класса, который был определен в пространстве имен. Я пытался использовать класс без имен, вызывает ошибку компилятора на"идентификатор "у класса MyClass, то" не определено" по. Добавление
using namespace <MyNamespace>
или с помощью класса, как
MyNamespace::MyClass myClass;
решил проблему.
В C и C++ все имена должны быть объявлены прежде чем они используются. Если вы пытаетесь использовать имя переменной или функции, которые еще'т было задекларировано вы получите и"необъявленный идентификатор ошибка" ошибка.
Однако, функции представляют собой особый случай в C (и C) в том, что вы Don'т иметь, чтобы объявить их в первую очередь. Компилятор C будет предположим, что функция не существует с количество и тип аргументов при вызове. Если фактическое определение функции не совпадают, то возникает другая ошибка. Это особый случай для функции не существует в C++.
Вы исправить эти ошибки, убедившись, что функции и переменные объявлены прежде чем они используются. В случае е
, вам необходимо включить заголовочный файл в <с stdio.ч>
(или в <с cstdio>
в C++).
Для стандартных функций, я рекомендую вам проверить, например, эта ссылка на сайт, и найти функции, которые вы хотите использовать. В документации для каждой функции говорит вам, какой заголовочный файл нужно.
Эти ошибки meassages
1.For the Visual Studio compiler: error C2065: 'printf' : undeclared identifier
2.For the GCC compiler: `printf' undeclared (first use in this function)
означает, что вы используете имя е
, но компилятор не видит, где имя был объявлен и, соответственно, не знаю, что это значит.
Любое имя, используемое в программе, должно быть объявлено до его использования. Компилятор должен знать, что имя обозначает.
В данном конкретном случае компилятор не видит объявление название Е
. Как мы знаем (а не компилятор) это название стандартной функции C заявленной в заголовке <студии.ч>
в C или в заголовок в <с cstdio>
в C++ и помещается в стандартный (СТД::) и Global (
::`) (не обязательно) пространствах имен.
Поэтому прежде чем использовать эту функцию, мы должны обеспечить свое заявление имя компилятора, включая соответствующие заголовки.
Например С:
#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
это два разных названия одной из которых был объявлен и другой не был объявлен, но используется в теле main
Другая возможная ситуация: доступ родителя (шаблонный класс) - члены класса шаблона.
Способ исправить: с помощью членов родительского класса его полное имя (с помощью префикса это->
или `parentClassName:: на имя участника).
Каждый необъявленная переменная в C выходит ошибка, потому что компилятор не может найти его в проекте. Можно включать внешние (заголовок файла) библиотеке, в которой переменная определена. Поэтому на ваш вопрос, вы требуете <студии.ч>
, что это стандартный поток ввода выходной файл, который описывает функции printf(), функциональность.
Согласно документация, декларация fprintf() в <с cstdio и GT; т. е. вы должны включить его, прежде чем использовать эту функцию.
Это как с использованием функции без ее объявления. <из stdio.ч> заголовочный файл будет содержать функция printf(). Включить заголовочный файл в программу это решение для этого. Некоторые пользовательские функции также могут по ошибке, когда не объявлена перед использованием. Если он используется во всем мире нет проблем.
Большую часть времени, если вы не очень уверены, что вы импортировали библиотеку в вопрос, в Visual Studio будет направлять вас с технологией IntelliSense.
Вот то, что работал для меня:
Убедитесь, что #включить "в файл stdafx.ч"
в объявлена первый, то есть в верхней части всех включает.
В идентификаторах C++ - это имя, используемое для идентификации переменной, функции, класса, модуля или любой другой пользовательский элемент. В C++ все имена должны быть объявлены прежде чем они используются. Если вы пытаетесь использовать имя такое, что уже'т было задекларировано вы получите и"необъявленный идентификатор" и компиляции-ошибка.
Согласно документация, объявление функции printf() в с cstdio, т. е. вы должны включить его, прежде чем использовать эту функцию.