Идентификатор cout не определен visual studio
Пример текстов ошибок:
- Для компилятора Visual Studio: error C2065: 'cout' : undeclared identifier
- Для компилятора GCC: 'cout' undeclared (first use in this function)
Решение
Чаще всего они приходят из-за того, что забывают включить заголовочный файл, содержащий объявление функции, например, эта программа выдаст ошибку «необъявленный идентификатор»:
Отсутствует заголовок
Если вы написали заголовок и включили его правильно, заголовок может содержать неправильный включить охрану .
Переменная с ошибкой
Другой распространенный источник ошибки новичка возникает, когда вы неправильно написали переменную:
Неправильный объем
Например, этот код выдаст ошибку, потому что вам нужно использовать std::string :
Использовать до объявления
Или добавить декларацию g до f :
stdafx.h не сверху (специфично для VS)
Не стесняйтесь редактировать этот ответ.
Другие решения
Рассмотрим похожую ситуацию в разговоре. Представьте, что ваш друг говорит вам: «Боб идет на ужин», а ты не представляешь, кто такой Боб. Вы будете в замешательстве, верно? Твой друг должен был сказать: «У меня есть коллега по работе по имени Боб. Боб подходит к обеду». Теперь Боб объявлен, и вы знаете, о ком говорит ваш друг.
Компилятор выдает ошибку «необъявленный идентификатор», когда вы пытаетесь использовать какой-то идентификатор (который будет именем функции, переменной, класса и т. Д.), И компилятор не видит объявления для него. То есть компилятор понятия не имеет, о чем вы говорите, потому что раньше его не видел.
Если вы получаете такую ошибку в 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 два разных имени, одно из которых было объявлено, а другое не объявлено, но используется в теле основного
Другая возможная ситуация: доступ к родительскому элементу (классу шаблона) в классе шаблона.
Это похоже на использование функции без ее объявления. заголовочный файл будет содержать
функция printf (). Включите заголовочный файл в вашу программу, это решение для этого.
Некоторые пользовательские функции могут также вызывать ошибки, если они не были объявлены перед использованием. Если
это используется во всем мире без проб.
В большинстве случаев, если вы уверены, что импортировали данную библиотеку, Visual Studio поможет вам с IntelliSense.
Вот что сработало для меня:
Компилятору не удается найти объявление идентификатора. Эта ошибка имеет несколько возможных причин. Наиболее распространенными причинами C2065 является то, что идентификатор не был объявлен, идентификатор написан неправильно, заголовок, где объявляется идентификатор, не включается в файл, или в идентификаторе отсутствует квалификатор области, например, cout вместо std::cout . Дополнительные сведения об объявлениях в C++ см. в разделе объявления и определения (c++).
Ниже приведены некоторые распространенные проблемы и более подробные решения.
Идентификатор не объявлен
Если идентификатор является переменной или именем функции, его необходимо объявить перед тем, как его можно будет использовать. Перед использованием функции в объявлении функции также должны быть включены типы его параметров. Если переменная объявлена с помощью auto , компилятор должен иметь возможность определить тип из его инициализатора.
Если идентификатор является членом класса или структуры или объявлен в пространстве имен, он должен уточняться именем класса или структуры или именем пространства имен при использовании вне структуры, класса или области пространства имен. Кроме того, пространство имен должно быть помещено в область с помощью using директивы, такой как using namespace std; , или имя члена должно быть помещено в область с помощью using объявления, такого как using std::string; . В противном случае неполное имя считается необъявленным идентификатором в текущей области.
Если идентификатор является тегом для определяемого пользователем типа, например, class или struct , тип тега должен быть объявлен до его использования. Например, объявление struct SomeStruct < /*. */ >; должно существовать, прежде чем можно будет объявить переменную SomeStruct myStruct; в коде.
Если идентификатор является псевдонимом типа, тип должен быть объявлен с помощью using объявления или typedef перед тем, как его можно будет использовать. Например, необходимо объявить using my_flags = std::ios_base::fmtflags; , прежде чем можно будет использовать my_flags в качестве псевдонима типа для std::ios_base::fmtflags .
Пример: идентификатор с ошибками
Эта ошибка обычно возникает, когда имя идентификатора написано неправильно или идентификатор использует неправильные прописные и строчные буквы. Имя в объявлении должно точно совпадать с именем, которое вы используете.
Пример. Использование неограниченного идентификатора
Эта ошибка может возникать, если идентификатор не является правильно заданной областью. Если вы видите C2065 при использовании cout , это является причиной. Если функции и операторы стандартной библиотеки C++ не полностью определены в пространстве имен или вы не std передали пространство имен в текущую область с помощью using директивы, компилятор не сможет их найти. Чтобы устранить эту проблему, необходимо либо полностью определить имена идентификаторов, либо указать пространство имен с помощью using директивы.
Этот пример не компилируется, поскольку cout и endl определены в std пространстве имен:
Идентификаторы, объявляемые внутри class типов, struct или enum class , также должны уточняться именем их включающей области при их использовании за пределами этой области.
Пример: предварительно скомпилированный заголовок не является первым
Этот пример не удается скомпилировать, поскольку cout и endl определены в < заголовке iostream >, который игнорируется, так как он включается перед предкомпилированным файлом заголовка. Чтобы выполнить сборку этого примера, создайте все три файла, а затем скомпилируйте файл stdafx. cpp, а затем скомпилируйте C2065_pch. cpp.
Пример: отсутствует заголовочный файл
Вы не включили заголовочный файл, объявляющий идентификатор. Убедитесь, что файл, содержащий объявление идентификатора, включен в каждый исходный файл, который его использует.
Другая возможная причина заключается в том, что при использовании списка инициализаторов не включается < заголовок initializer_list >.
эта ошибка может возникать в исходных файлах Windows классических приложений, если вы определяете VC_EXTRALEAN , WIN32_LEAN_AND_MEAN или WIN32_EXTRA_LEAN . Эти макросы препроцессора исключают некоторые файлы заголовков из Windows. h и afxv_w32. h для ускорения компиляции. Просмотрите Windows. h и afxv_w32. h, чтобы получить последние сведения о том, что исключено.
Пример: отсутствует закрывающая кавычка
Эта ошибка может возникать, если отсутствует закрывающая кавычка после строковой константы. Это простой способ запутывания компилятора. Обратите внимание, что пропущенная закрывающая кавычка может быть в нескольких строках перед сообщаемым расположением ошибки.
Пример. Использование итератора вне области действия цикла
Эта ошибка может возникать, если объявить переменную-итератор в for цикле, а затем попробовать использовать эту переменную итератора вне области for цикла. Компилятор включает параметр компилятора /Zc: forScope по умолчанию. Дополнительные сведения см. в разделе Поддержка итераторов отладки .
Пример: объявление удаленного препроцессора
Эта ошибка может возникать, если вы ссылаетесь на функцию или переменную, которая находится в коде, скомпилированном по условию, который не компилируется для текущей конфигурации. Это также может произойти при вызове функции в файле заголовка, который в настоящее время не поддерживается в среде сборки. Если определенные переменные или функции доступны только при определении конкретного макроса препроцессора, убедитесь, что код, вызывающий эти функции, может быть скомпилирован только при определении одного и того же макроса препроцессора. Эту ошибку легко выявить в интегрированной среде разработки, так как объявление функции недоступно, если требуемые макросы препроцессора не определены для текущей конфигурации сборки.
Это пример кода, который работает при сборке в отладке, но не в розницу:
Пример: сбой выведения типа C++/CLI
Эта ошибка может возникать при вызове универсальной функции, если аргумент предполагаемого типа не может быть выведен из используемых параметров. Дополнительные сведения см. в разделе универсальные функции (C++/CLI).
Пример: параметры атрибута C++/CLI
эта ошибка также может быть вызвана работой по согласованности компилятора, выполненной для Visual Studio 2005: проверка параметров для Visual C++ных атрибутов.
Компилятору не удалось разрешить ссылку на идентификатор даже при поиске с зависимостью от аргументов.
Комментарии
Чтобы устранить эту ошибку, сравните использование идентификатора с объявлением идентификатора для Регистра и проверки орфографии. Убедитесь, что операторы разрешения области и пространство имен, использующие директивы , используются правильно. Если идентификатор объявлен в файле заголовка, убедитесь, что заголовок включен перед ссылкой на идентификатор. Если идентификатор должен быть видимым извне, убедитесь, что он объявлен в любом исходном файле, который его использует. Также убедитесь, что объявление идентификатора или определение не исключены директивами условной компиляции.
изменения в удалении устаревших функций из библиотеки времени выполнения C в Visual Studio 2015 могут вызвать C3861. Чтобы устранить эту ошибку, удалите ссылки на эти функции или замените их безопасными альтернативами, если они есть. Дополнительные сведения см. в разделе устаревшие функции.
если ошибка C3861 появляется после миграции проекта из предыдущих версий компилятора, могут возникнуть проблемы, связанные с поддерживаемыми версиями Windows. Visual C++ больше не поддерживает создание программ для Windows 95, Windows 98, Windows ME, Windows NT и Windows 2000. Если ваши макросы WINVER или _WIN32_WINNT предназначены для одной из этих версий Windows, необходимо изменить такие макросы. Дополнительные сведения см. в разделе изменение winver и _WIN32_WINNT.
Примеры
Неопределенный идентификатор
Следующий пример приводит к возникновению ошибки C3861, поскольку идентификатор не определен.
Идентификатор не находится в области
Следующий пример приводит к возникновению ошибки C3861, поскольку идентификатор виден только в области файла его определения, если только он не объявлен в других исходных файлах, которые его используют.
Требуется квалификация пространства имен
Для std классов исключений в стандартной библиотеке C++ требуется пространство имен.
Вызвана устаревшая функция
Устаревшие функции были удалены из библиотеки CRT.
Функции ADL и Friend
Следующий пример приводит к возникновению ошибки C3767, так как компилятор не может использовать поиск с зависимостью от аргумента для FriendFunc :
Чтобы устранить эту ошибку, объявите дружественную команду в области класса и определите ее в области видимости пространства имен:
Объясните мне неразумному. . еще раз.. .
Занимаюсь (пытаюсь) по книге "Освой самостоятельно С++ за 21 день". Но пытаюсь освоить через в Microsoft Visual Studio 2012. Итак код:
А ошибки все те же (вроде я тыкал, но нутром чую что не так тыкал и не с тем выражением лица)
1>------Построение начато: проект: Urok1_Zad, Конфигурация: Debug Win32 ------
1> Исходный код. cpp
1>d:\my documents\documents\visual studio 2012\projects\hello\urok1_zad\urok1_zad\исходный код. cpp(6): error C2065: endl: необъявленный идентификатор
1>d:\my documents\documents\visual studio 2012\projects\hello\urok1_zad\urok1_zad\исходный код. cpp(8): error C2065: endl: необъявленный идентификатор
========== Построение: успешно: 0, с ошибками: 1, без изменений: 0, пропущено: 0 ==========
Как же грамотно и правильно переделать код, чтобы объявить идентификатор/ы и были объявлены переменные?
С надеждой и нетерпением буду ждать вашего ответа.
ra, спасибо. Помогло.
=Serje=, он не только ругается но и отказывается выполнять. Даже в заявленном в учебнике "Microsot Visual C++ 6." Происходит хоть и выполнение, но с замечаниями.
Купил книгу "Пятое издание", когда уже 7-е. Кстати, что примечательно. Скачал Пример рекомендованный в самой "Microsoft Visual Studio 2012". И он отказывается выполняться или выполняется с замечаниями.
std::endl вместо endl
либо объявите явно использование пространства имен std в своей программе:
Компилятор честно поругался на endl, а ты его про игнорировал. endl, как и cout, видны в пространстве имен std.
Привет ребята.
поясните мне пожалуйста что я не так делаю?
error C2065: Var: необъявленный идентификатор
error C2146: синтаксическая ошибка: отсутствие ";" перед идентификатором "R1"
: error C2065: R1: необъявленный идентификатор
: error C2065: R2: необъявленный идентификатор
: error C2143: синтаксическая ошибка: отсутствие ";" перед ":"
: error C2146: синтаксическая ошибка: отсутствие ";" перед идентификатором "Write"
C4551: в вызове функции отсутствует список аргументов
error C2065: Write: необъявленный идентификатор
error C2015: слишком много знаков в константе
error C2065: R1: необъявленный идентификатор
error C2143: синтаксическая ошибка: отсутствие ";" перед "строка"
error C3861: Readln: идентификатор не найден
error C2146: синтаксическая ошибка: отсутствие ";" перед идентификатором "Write"
error C2065: Write: необъявленный идентификатор
: error C2015: слишком много знаков в константе
: error C2065: R2: необъявленный идентификатор
: error C3861: Readln: идентификатор не найден
error C2061: синтаксическая ошибка: идентификатор "R1"
: error C2181: недопустимый else без парного if
error C2065: writeln: необъявленный идентификатор
error C2059: синтаксическая ошибка: >
I am working on the 'driver' part of my programing assignment and i keep getting this absurd error:
error C2065: 'cout' : undeclared identifier
I have even tried using the std::cout but i get another error that says: IntelliSense: namespace "std" has no member "cout" when i have declared using namespace std, included iostream + i even tried to use ostream
I know it's a standard noob question but this has stumped me and I'm a novice (meaning: I've programed before. )
I'm using Visual Studio 2010 and running Windows 7. All of the .h files have "using namespace std" and include iostream and ostream.
"NOTE: all of the .h files include namespace std - and include io and o streams. "
26 Answers 26
These will not work.
Yeah, this on should be the accepted answer. Most of the others work as well, but this states it very clearly. @Wallter
write this code, it works perfectly..
I had same problem on Visual Studio C++ 2010. It's easy to fix. Above the main() function just replace the standard include lines with this below but with the pound symbol in front of the includes.
The include "stdafx.h" is ok
But you can't use cout unless you have included using namespace std
If you have not included namespace std you have to write std::cout instead of simple cout
This is the correct answer. You need to use `using namespace std' where cout resides. In modern C++, all functions are within is own namespace.
I have seen that if you use
then you will get the problem.
(notice - without the .h)
then you will not get the problem you mentioned.
@JavaRunner: Because the file is named iostream . It is not named iostream.h . iostream.h does not exist. Simple as that.
The code below compiles and runs properly for me using gcc. Try copy/pasting this and see if it works.
yeah same thing - Error 1 error C2065: 'cout' : undeclared identifier && IntelliSense: identifier "cout" is undefined
Does std::cout work? I don't know much about Visual Studio, are you sure you've set the project up correctly as a C++ project? If you open the file iostream does it contain a cout declaration?
Given that VS2010 is still beta it might be a bug (which beta version are you using?). But I find it hard to believe that something so basic doesn't work correctly.
If the only file you include is iostream and it still says undefined, then maybe iostream doesn't contain what it's supposed to. Is it possible that you have an empty file coincidentally named "iostream" in your project?
I've seen similar things happen when I was using the .c file extension with C++ code. Other than that, I'd have to agree with everyone about a buggy installation. Does it work if you try to compile the project with an earlier release of VS? Try VC++ Express 2008. Its free on msdn.
Such a silly solution in my case:
The above was odered as per example a, when I changed it to resemble example b below.
My code compiled like a charm. Try it, guaranteed to work.
I have VS2010, Beta 1 and Beta 2 (one on my work machine and one at home), and I've used std plenty without issues. Try typing:
And see if Intellisense gives you anything. If it gives you the usual stuff ( abort , abs , acos , etc.), except for cout , well then, that is quite a puzzler. Definitely look into your C++ headers in that case.
Beyond that, I would just add to make sure you're running a regular, empty project (not CLR, where Intellisense is crippled), and that you've actually attempted to build the project at least once. As I mentioned in a comment, VS2010 parses files once you've added an include ; it could be that something stuck the parser and it didn't "find" cout right away. (In which case, try restarting VS maybe?)
Читайте также: