"идентификатор": необъявленный идентификатор ‘identifier‘ : undeclared identifier
Компилятору не удается найти объявление идентификатора. The compiler can’t find the declaration for an identifier. Эта ошибка может быть вызвана многими причинами. There are many possible causes for this error. Наиболее распространенными причинами C2065 является то, что идентификатор не был объявлен, идентификатор написан неправильно, заголовок, где объявляется идентификатор, не включается в файл, или в идентификаторе отсутствует квалификатор области, например, cout вместо std::cout . The most common causes of C2065 are that the identifier hasn’t been declared, the identifier is misspelled, the header where the identifier is declared is not included in the file, or the identifier is missing a scope qualifier, for example, cout instead of std::cout . Дополнительные сведения об объявлениях в C++см. в разделе объявления иC++определения (). For more information on declarations in C++, see Declarations and Definitions (C++).
Ниже приведены некоторые распространенные проблемы и более подробные решения. Here are some common issues and solutions in greater detail.
Содержание
- Идентификатор не объявлен The identifier is undeclared
- Пример: идентификатор с ошибками Example: misspelled identifier
- Пример. Использование неограниченного идентификатора Example: use an unscoped identifier
- Пример: предварительно скомпилированный заголовок не является первым Example: precompiled header isn’t first
- Пример: отсутствует заголовочный файл Example: missing header file
- Пример: отсутствует закрывающая кавычка Example: missing closing quote
- Пример. Использование итератора вне области действия цикла Example: use iterator outside for loop scope
- Пример: объявление удаленного препроцессора Example: preprocessor removed declaration
- Пример C++Сбой выведения типа/CLI Example: C++/CLI type deduction failure
- Пример C++Параметры атрибута/CLI Example: C++/CLI attribute parameters
- Решение
- Отсутствует заголовок
- Переменная с ошибкой
- Неправильный объем
- Использовать до объявления
- stdafx.h не сверху (специфично для VS)
- Другие решения
- 1 ответ 1
- Всё ещё ищете ответ? Посмотрите другие вопросы с метками c++ visual-studio-2015 или задайте свой вопрос.
Идентификатор не объявлен The identifier is undeclared
Если идентификатор является переменной или именем функции, его необходимо объявить перед тем, как его можно будет использовать. If the identifier is a variable or a function name, you must declare it before it can be used. Перед использованием функции в объявлении функции также должны быть включены типы его параметров. A function declaration must also include the types of its parameters before the function can be used. Если переменная объявлена с помощью auto , компилятор должен иметь возможность определить тип из его инициализатора. If the variable is declared using auto , the compiler must be able to infer the type from its initializer.
Если идентификатор является членом класса или структуры или объявлен в пространстве имен, он должен уточняться именем класса или структуры или именем пространства имен при использовании вне структуры, класса или области пространства имен. If the identifier is a member of a class or struct, or declared in a namespace, it must be qualified by the class or struct name, or the namespace name, when used outside the struct, class, or namespace scope. Кроме того, пространство имен должно быть помещено в область using с помощью директивы, такой как using namespace std; , или имя члена должно быть помещено using в область с помощью using std::string; объявления, такого как. Alternatively, the namespace must be brought into scope by a using directive such as using namespace std; , or the member name must be brought into scope by a using declaration, such as using std::string; . В противном случае неполное имя считается необъявленным идентификатором в текущей области. Otherwise, the unqualified name is considered to be an undeclared identifier in the current scope.
Если идентификатор является тегом для определяемого пользователем типа, например, class или struct , тип тега должен быть объявлен до его использования. If the identifier is the tag for a user-defined type, for example, a class or struct , the type of the tag must be declared before it can be used. Например, объявление struct SomeStruct < /*. */ >; должно существовать, прежде чем можно будет объявить переменную SomeStruct myStruct; в коде. For example, the declaration struct SomeStruct < /*. */ >; must exist before you can declare a variable SomeStruct myStruct; in your code.
Если идентификатор является псевдонимом типа, тип должен быть объявлен с помощью using объявления или typedef перед тем, как его можно будет использовать. If the identifier is a type alias, the type must be declared by using a using declaration or typedef before it can be used. Например, необходимо объявить using my_flags = std::ios_base::fmtflags; , прежде чем можно будет использовать my_flags в качестве псевдонима std::ios_base::fmtflags типа для. For example, you must declare using my_flags = std::ios_base::fmtflags; before you can use my_flags as a type alias for std::ios_base::fmtflags .
Пример: идентификатор с ошибками Example: misspelled identifier
Эта ошибка обычно возникает, когда имя идентификатора написано неправильно или идентификатор использует неправильные прописные и строчные буквы. This error commonly occurs when the identifier name is misspelled, or the identifier uses the wrong uppercase and lowercase letters. Имя в объявлении должно точно совпадать с именем, которое вы используете. The name in the declaration must exactly match the name you use.
Пример. Использование неограниченного идентификатора Example: use an unscoped identifier
Эта ошибка может возникать, если идентификатор не является правильно заданной областью. This error can occur if your identifier is not properly scoped. Если вы видите C2065 при использовании cout , это является причиной. If you see C2065 when you use cout , this is the cause. Если C++ функции и операторы стандартной библиотеки не полностью определены в пространстве имен или если std пространство имен не было перенесено в текущую using область с помощью директивы, компилятор не может их найти. When C++ Standard Library functions and operators are not fully qualified by namespace, or you have not brought the std namespace into the current scope by using a using directive, the compiler can’t find them. Чтобы устранить эту проблему, необходимо либо полностью определить имена идентификаторов, либо указать пространство имен с помощью using директивы. To fix this issue, you must either fully qualify the identifier names, or specify the namespace with the using directive.
Этот пример не компилируется, cout поскольку endl и определены в std пространстве имен: This example fails to compile because cout and endl are defined in the std namespace:
Идентификаторы, объявляемые внутри class типов, struct или enum class , также должны уточняться именем их включающей области при их использовании за пределами этой области. Identifiers that are declared inside of class , struct , or enum class types must also be qualified by the name of their enclosing scope when you use them outside of that scope.
Пример: предварительно скомпилированный заголовок не является первым Example: precompiled header isn’t first
Эта ошибка может возникать, если вы поместили директивы препроцессора, такие как #include, #define или #pragma, перед #includeом предкомпилированного файла заголовка. This error can occur if you put any preprocessor directives, such as #include, #define, or #pragma, before the #include of a precompiled header file. Если исходный файл использует предварительно скомпилированный заголовочный файл (то есть если он компилируется с помощью параметра компилятора /Yu ), то все директивы препроцессора перед файлом предкомпилированного заголовка будут проигнорированы. If your source file uses a precompiled header file (that is, if it’s compiled by using the /Yu compiler option) then all preprocessor directives before the precompiled header file are ignored.
Этот пример не удается скомпилировать, cout поскольку endl и определены в , который игнорируется, так как он включается перед предкомпилированным файлом заголовка. This example fails to compile because cout and endl are defined in the header, which is ignored because it is included before the precompiled header file. Чтобы выполнить сборку этого примера, создайте все три файла, а затем скомпилируйте файл stdafx. cpp, а затем скомпилируйте C2065_pch. cpp. To build this example, create all three files, then compile stdafx.cpp, then compile C2065_pch.cpp.
Чтобы устранить эту проблему, добавьте #include <> iostream в файл предкомпилированного заголовка или переместите его после включения файла предкомпилированного заголовка в исходный файл. To fix this issue, add the #include of into the precompiled header file, or move it after the precompiled header file is included in your source file.
Пример: отсутствует заголовочный файл Example: missing header file
Вы не включили заголовочный файл, объявляющий идентификатор. You have not included the header file that declares the identifier. Убедитесь, что файл, содержащий объявление идентификатора, включен в каждый исходный файл, который его использует. Make sure the file that contains the declaration for the identifier is included in every source file that uses it.
Другая возможная причина — при использовании списка инициализаторов без включения . Another possible cause is if you use an initializer list without including the header.
Эта ошибка может возникать в исходных файлах Windows Desktop App, если вы VC_EXTRALEAN определяете, WIN32_EXTRA_LEAN WIN32_LEAN_AND_MEAN или. You may see this error in Windows Desktop app source files if you define VC_EXTRALEAN , WIN32_LEAN_AND_MEAN , or WIN32_EXTRA_LEAN . Эти макросы препроцессора исключают некоторые файлы заголовков из_Windows. h и афксв W32. h для ускорения компиляции. These preprocessor macros exclude some header files from windows.h and afxv_w32.h to speed compiles. Просмотрите Windows. h и afxv_w32. h, чтобы получить последние сведения о том, что исключено. Look in windows.h and afxv_w32.h for an up-to-date description of what’s excluded.
Пример: отсутствует закрывающая кавычка Example: missing closing quote
Эта ошибка может возникать, если отсутствует закрывающая кавычка после строковой константы. This error can occur if you are missing a closing quote after a string constant. Это простой способ запутывания компилятора. This is an easy way to confuse the compiler. Обратите внимание, что пропущенная закрывающая кавычка может быть в нескольких строках перед сообщаемым расположением ошибки. Note that the missing closing quote may be several lines before the reported error location.
Пример. Использование итератора вне области действия цикла Example: use iterator outside for loop scope
Эта ошибка может возникать, если объявить переменную- for итератор в цикле, а затем попробовать использовать эту переменную итератора вне области for цикла. This error can occur if you declare an iterator variable in a for loop, and then you try to use that iterator variable outside the scope of the for loop. Компилятор включает параметр компилятора /Zc: forScope по умолчанию. The compiler enables the /Zc:forScope compiler option by default. Дополнительные сведения см. в разделе Поддержка итераторов отладки . See Debug Iterator Support for more information.
Пример: объявление удаленного препроцессора Example: preprocessor removed declaration
Эта ошибка может возникать, если вы ссылаетесь на функцию или переменную, которая находится в коде, скомпилированном по условию, который не компилируется для текущей конфигурации. This error can occur if you refer to a function or variable that is in conditionally compiled code that is not compiled for your current configuration. Это также может произойти при вызове функции в файле заголовка, который в настоящее время не поддерживается в среде сборки. This can also occur if you call a function in a header file that is currently not supported in your build environment. Если определенные переменные или функции доступны только при определении конкретного макроса препроцессора, убедитесь, что код, вызывающий эти функции, может быть скомпилирован только при определении одного и того же макроса препроцессора. If certain variables or functions are only available when a particular preprocessor macro is defined, make sure the code that calls those functions can only be compiled when the same preprocessor macro is defined. Эту ошибку легко выявить в интегрированной среде разработки, так как объявление функции недоступно, если требуемые макросы препроцессора не определены для текущей конфигурации сборки. This issue is easy to spot in the IDE, because the declaration for the function is greyed out if the required preprocessor macros are not defined for the current build configuration.
Это пример кода, который работает при сборке в отладке, но не в розницу: This is an example of code that works when you build in Debug, but not Retail:
Пример C++Сбой выведения типа/CLI Example: C++/CLI type deduction failure
Эта ошибка может возникать при вызове универсальной функции, если аргумент предполагаемого типа не может быть выведен из используемых параметров. This error can occur when calling a generic function, if the intended type argument cannot be deduced from the parameters used. Дополнительные сведения см. в разделе универсальныеC++функции (/CLI). For more information, see Generic Functions (C++/CLI).
Пример C++Параметры атрибута/CLI Example: C++/CLI attribute parameters
Эта ошибка также может быть вызвана работой по согласованности компилятора, выполненной для Visual Studio 2005: Проверка параметров для визуальных C++ атрибутов. This error can also be generated as a result of compiler conformance work that was done for Visual Studio 2005: parameter checking for Visual C++ attributes.
Что такое необъявленные ошибки идентификатора? Каковы общие причины и как их исправить?
Пример текстов ошибок:
- Для компилятора Visual Studio: error C2065: ‘cout’ : undeclared identifier
- Для компилятора GCC: ‘cout’ undeclared (first use in this function)
Решение
Чаще всего они приходят из-за того, что забывают включить заголовочный файл, содержащий объявление функции, например, эта программа выдаст ошибку «необъявленный идентификатор»:
Отсутствует заголовок
Чтобы это исправить, мы должны включить заголовок:
Если вы написали заголовок и включили его правильно, заголовок может содержать неправильный включить охрану .
Переменная с ошибкой
Другой распространенный источник ошибки новичка возникает, когда вы неправильно написали переменную:
Неправильный объем
Например, этот код выдаст ошибку, потому что вам нужно использовать std::string :
Использовать до объявления
g не был объявлен до его первого использования. Чтобы это исправить, либо переместите определение g до f :
Или добавить декларацию g до f :
stdafx.h не сверху (специфично для VS)
Это зависит от Visual Studio. В VS нужно добавить #include "stdafx.h" перед любым кодом. Код до того, как он игнорируется компилятором, так что если у вас есть это:
#include будет проигнорировано Вам нужно переместить его ниже:
Не стесняйтесь редактировать этот ответ.
Другие решения
Рассмотрим похожую ситуацию в разговоре. Представьте, что ваш друг говорит вам: «Боб идет на ужин», а ты не представляешь, кто такой Боб. Вы будете в замешательстве, верно? Твой друг должен был сказать: «У меня есть коллега по работе по имени Боб. Боб подходит к обеду». Теперь Боб объявлен, и вы знаете, о ком говорит ваш друг.
Компилятор выдает ошибку «необъявленный идентификатор», когда вы пытаетесь использовать какой-то идентификатор (который будет именем функции, переменной, класса и т. Д.), И компилятор не видит объявления для него. То есть компилятор понятия не имеет, о чем вы говорите, потому что раньше его не видел.
Если вы получаете такую ошибку в C или C ++, это означает, что вы не сказали компилятору о том, что вы пытаетесь использовать. Объявления часто встречаются в заголовочных файлах, поэтому, скорее всего, это означает, что вы не включили соответствующий заголовок. Конечно, может случиться так, что вы просто не помните, чтобы объявить сущность вообще.
Некоторые компиляторы выдают более конкретные ошибки в зависимости от контекста. Например, пытаясь скомпилировать X x; где тип X не был объявлен с Clang скажет вам «неизвестное имя типа X «. Это гораздо полезнее, потому что вы знаете, что он пытается интерпретировать X как тип. Тем не менее, если у вас есть int x = y; , где y еще не объявлено, он скажет вам «использование необъявленного идентификатора y «потому что есть некоторая двусмысленность в том, что именно y может представлять.
У меня была такая же проблема с пользовательским классом, который был определен в пространстве имен. Я пытался использовать класс без пространства имен, вызывая ошибку компилятора «идентификатор» MyClass «не определен».
Добавление
или используя класс, как
В C и C ++ все имена должны быть объявлены перед использованием. Если вы попытаетесь использовать имя переменной или функции, которая не была объявлена, вы получите ошибку «необъявленный идентификатор».
Однако функции — это особый случай в C (и только в C), в котором вам не нужно сначала объявлять их. Компилятор C будет предполагать, что функция существует с числом и типом аргументов, как в вызове. Если фактическое определение функции не совпадает, вы получите еще одну ошибку. Этот особый случай для функций не существует в C ++.
Вы исправляете ошибки такого рода, проверяя, что функции и переменные объявлены до их использования. В случае printf вам нужно включить заголовочный файл (или же в C ++).
Для стандартных функций я рекомендую вам проверить, например, этот справочный сайт , и найдите функции, которые вы хотите использовать. Документация для каждой функции говорит вам, какой заголовочный файл вам нужен.
Эти сообщения об ошибках
означает, что вы используете имя printf но компилятор не видит, где было объявлено имя, и, соответственно, не знает, что это значит.
Любое имя, используемое в программе, должно быть объявлено до ее использования. Компилятор должен знать, что обозначает имя.
В этом конкретном случае компилятор не видит объявление имени printf , Как мы знаем (но не компилятор) это имя стандартной функции C, объявленной в заголовке в C или в заголовке в C ++ и размещены в стандарте ( std:: ) и глобальный ( :: ) (не обязательно) пространства имен.
Поэтому, прежде чем использовать эту функцию, мы должны предоставить объявление ее имени компилятору путем включения соответствующих заголовков.
Например
C:
C ++:
Иногда причиной такой ошибки является простая опечатка. Например, давайте предположим, что вы определили функцию PrintHello
но в основном вы сделали опечатку и вместо PrintHello ты напечатал printHello с строчной буквы «р».
В этом случае компилятор выдаст такую ошибку, потому что он не видит объявление имени printHello , PrintHello а также printHello два разных имени, одно из которых было объявлено, а другое не объявлено, но используется в теле основного
Другая возможная ситуация: доступ к родительскому элементу (классу шаблона) в классе шаблона.
Исправить метод: использование родительского члена класса по его полному имени (с помощью префикса this-> или же parentClassName:: на имя члена).
Это похоже на использование функции без ее объявления. заголовочный файл будет содержать
функция printf (). Включите заголовочный файл в вашу программу, это решение для этого.
Некоторые пользовательские функции могут также вызывать ошибки, если они не были объявлены перед использованием. Если
это используется во всем мире без проб.
В большинстве случаев, если вы уверены, что импортировали данную библиотеку, Visual Studio поможет вам с IntelliSense.
Пишу программу и вылетает такая ошибка:
error C2065: ‘cout’: undeclared identifier;
В чём может быть причина?
1 ответ 1
Заголовок, который используется для precompiled headers, в Visual Studio, всегда должен быть первой строчкой в файле, в который он включается. Это требование появилось потому, что всё, что идёт до этого включения игнорируется.
Поэтому, чтобы решить Вашу проблему, необходимо сделать #include "stdafx.h" первой строчкой в файле.
Всё ещё ищете ответ? Посмотрите другие вопросы с метками c++ visual-studio-2015 или задайте свой вопрос.
Похожие
Для подписки на ленту скопируйте и вставьте эту ссылку в вашу программу для чтения RSS.
дизайн сайта / логотип © 2019 Stack Exchange Inc; пользовательское содержимое попадает под действие лицензии cc by-sa 4.0 с указанием ссылки на источник. rev 2019.11.15.35459






