Идентификатор cin не определен c visual studio

Обновлено: 04.07.2024

Поточный ввод-вывод в C++ выполняется с помощью функций сторонних библиотек. В С++, как и в С, нет встроенных в язык средств ввода-вывода.

В С для этих целей используется библиотека stdio.h .
В С++ разработана новая библиотека ввода-вывода iostream , использующая концепцию объектно-ориентированного программирования:

Библиотека iostream определяет три стандартных потока:

Для их использования в Microsoft Visual Studio необходимо прописать строку:

Для выполнения операций ввода-вывода переопределены две операции поразрядного сдвига:

  • >> получить из входного потока
  • << поместить в выходной поток

Вывод информации

cout << значение;

Здесь значение преобразуется в последовательность символов и выводится в выходной поток:

Возможно многократное назначение потоков:
cout << 'значение1' << 'значение2' << . << 'значение n';

int n;
char j;
cin >> n >> j;
cout << "Значение n равно" << n << "j=" << j;

Ввод информации

cin >> идентификатор;

При этом из входного потока читается последовательность символов до пробела, затем эта последовательность преобразуется к типу идентификатора, и получаемое значение помещается в идентификатор:

Возможно многократное назначение потоков:
cin >> переменная1 >> переменная2 >>. >> переменнаяn;

При наборе данных на клавиатуре значения для такого оператора должны быть разделены символами (пробел, \n, \t ).

Особого внимания заслуживает ввод символьных строк. По умолчанию потоковый ввод cin вводит строку до пробела, символа табуляции или перевода строки.

Для ввода текста до символа перевода строки используется манипулятор потока getline() :

Манипуляторы потока

Функцию - манипулятор потока можно включать в операции помещения в поток и извлечения из потока (<<, >>).

В С++ имеется ряд манипуляторов. Рассмотрим основные:

Пример Программа ввода-вывода значения переменной в C++

Та же программа, написанная на языке Си

Пример Использование форматированного вывода

Еще один пример использования форматированного вывода: для t∈[0;3] с шагом 0,5 вычислить значение y=cos(t).

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

Решение

Чаще всего они приходят из-за того, что забывают включить заголовочный файл, содержащий объявление функции, например, эта программа выдаст ошибку «необъявленный идентификатор»:

Отсутствует заголовок

Если вы написали заголовок и включили его правильно, заголовок может содержать неправильный включить охрану .

Переменная с ошибкой

Другой распространенный источник ошибки новичка возникает, когда вы неправильно написали переменную:

Неправильный объем

Например, этот код выдаст ошибку, потому что вам нужно использовать 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.

На данный вопрос уже ответили:

Я только начал разбираться с плюсами. И тут же воткнулся в какой-то непонятный для меня косяк.

Вроде все верно. Но при компиляции ошибка:

Я почитал у вас тут похожие темы. Пишут, что область имен надо объявить, она есть. Вроде вообще все как надо. Я использую VS 2017 для написания кода. Объясните, пожалуйста, что не так.

С надеждой и нетерпением буду ждать вашего ответа.

либо объявите явно использование пространства имен std в своей программе:

Этапы написания программы

Здорова господа! Я давно уже хотел написать статью о том как пользоваться отладкой в visual studio 2010, я сам правда не сильно знаю, от поэтому и пишу статью, что б разобраться и потом если что подсмотреть как ей пользоваться.

Содержание:

Базовые операции отладки

В каждой точке программы, где отладчик останавливается, можно посмотреть (и даже изменить) значения переменных, прежде чем продолжить выполнение. Можно изменить исходный код, перекомпилировать, а затем перезапустить программу сначала. Можно даже изменить исходный код посреди пошагового выполнения программы. При переходе к следующему оператору после модификации кода отладчик автоматически перекомпилирует программу перед выполнением следующего оператора.

QIP Shot - Screen 126

Мы можем выполнить этот пример по одному оператору за раз и наблюдать за содержимым интересующих переменных.

Прежде всего следует убедиться, что конфигурация сборки примера установлена в Win32 Debug, а не Win32 Release.

QIP Shot - Screen 127

Можно также использовать меню Построение -> диспетчер конфигурации и в открывшемся окне посмотреть

Конфигурация проекта Debug включает дополнительную информацию в вашу исполняемую программу во время компиляции, что позволяет потом использовать возможности отладки.

Установка точек останова

QIP Shot - Screen 131

Чтобы установить точку останова в начале строки исходного кода, щелкните на серой колонке слева от номера строки с оператором, перед которым хотите остановить выполнение. В ней появится красный кружок, называемый глифом (glyph), указывающий на точку останова в строке. Удалить эту точку можно с помощью двойного щелчка.

Расширенные точки останова

Более совершенный способ установки точек останова предлагается в окне, которое открывается с помощью комбинации клавиш <Alt+F9> или выбора пункта Breakpoints(Точки останова) из списка, отображаемого при выборе кнопки Windows(Окна) панели инструментов Debug, которая находится в ее правой части

QIP Shot - Screen 132

появится окно

Окно точек останова

в этом окне вы можете также настраивать точки останова, просто посмотрите что там есть, попробуйте понажимать по кнопкам.

Дополнительные параметры для точки останова устанавливаются целчком правой кнопкой мыши на строке останова в окне Breakpoints и выбором соответствующих пунктов из контекстного меню. Наряду с установкой точки останова в определенном месте кода можно также установить точку останова когда определенное логическое выражение вернет значение true. Это мощное средство, но оно влечет за собой очень существенные накладные расходы при выполнении программы, поскольку проверочное выражение должно постоянно вычисляться.

Установка точек трассировки

Function: $FUNCTION, Thread: $TID $TNAME

QIP Shot - Screen 136

Запуск отладки

меню отладка

Существует пять способов запуска приложения в режиме отладки через меню Debug (Отладка), которое показано ниже

  1. Пункт Start Debugging (Начать отладку), доступный и как кнопка панели инструментов Debug, просто запускает программу до первой точки останова (если она есть), где выполнение будет приостановлено. После того как вы просмотрите все необходимое в этой точке, выбор того же пункта меню или той же кнопки панели инструментов продолжит выполнение вплоть до следующей точки останова. Подобным образом можно передвигаться по программе от одной точки останова к другой и при каждой остановке выполнения просматривать критичные переменные, а по мере необходимости и изменять их значения. Если точек останова нет, запуск отладчика таким способом приведет к выполнению всей программы без остановок. Конечно факт запуска отладки подобным образом не означает, что вы обязаны продолжать ее в такой же манере при каждой остановке выполнения можно выбрать любой из доступных вариантов перемещения по коду.
  2. Пунк Attach to Process (Присоединиться к процессу) меню Debug позволяет отлаживать программу, которая уже запущена. Это средство отображает список процессов, работающих на машине, в котором можно выбрать процесс, требующий отладки. Это инструмент для опытных пользователей, и лучше избегать экспериментов с ним, если только вы не уверены в том, что собираетесь делать. Можно очень легко заблокировать машину или вызвать другие проблемы, если вмешаться в критические процессы операционной системы.
  3. Пункт меню Step Into (Войти), также доступный как кнопка панели инструментов Debug, выполняет программу по одному оператору за раз, входя в каждый блок кода, включая каждую вызываемую функцию. Это может оказаться весьма утомительным, если использовать такой режим отладки на протяжении всего процесса, поскольку при этом, например, будет выполняться весь код библиотечных функций, что вряд ли вас заинтересует, если только вы не заняты их разработкой. Небольшое количество библиотечных функций написано на языке ассемблер, включая некоторые из тех, которые поддерживают потоковый ввод вывод. Функции на языке ассемблер выполняются по одной машинной инструкции за раз, что как и можно ожидать, занимает значительное время.
  4. Пункт Step Over (Перешагнуть), также доступный в виде кнопки панели инструментов Debug, выполняет операторы программы по одному за раз и выполняет весь код функций, которые могут быть вызваны в операторе, без остановок.

[note]Какой бы способ из пяти вы б не выбрали для запуска процесса отладки, продолжайте выполнение, применив одну из пяти возможностей в любой из промежуточных точек останова.[/note]

Дальше просто ставите точки останова в коде, запускаете отладку любым из пяти способов, и затем смотрите необходимые значения переменных в меню Отладка=>Окна

QIP Shot - Screen 138

Как видно из рисунка выше можно посмотреть локальные и видимые переменные, а также их изменить. Что бы посмотреть локальные переменные выберите пункт Локальные.

QIP Shot - Screen 139

Вы их можете менять наведя на значение переменной и нажав два раза клавишей мышки

Так же можно посмотреть значение переменной наведя курсор мышки на эту переменную

QIP Shot - Screen 140

Так же можно посмотреть стек вызовов в окне Стек вызовов

QIP Shot - Screen 141

Во вкладке Отладка=>Окна=>Контрольные значения можно задавать переменные которые нужно отслеживать

QIP Shot - Screen 142

QIP Shot - Screen 143

появится окно в котором нужно ввести имя переменной или нескольких переменных. Добавление отладочного кода

При разработке крупных программ вы определенно нуждаетесь в добавлении специального кода, предназначенного для выявления ошибок, где только возможно, и предоставлении трассирующего вывода, который поможет найти местонахождение ошибок. Наверняка вы не захотите заниматься пошаговым выполнением кода до тех пор, пока не имеете представления о том, что собой представляет ошибка и в какой части кода ее следует искать. Код который выполняет упомянутые действия, необходим только на этапе проверки программы. Необходимость в нем отпадает, когда вы уверены, что программа полностью работоспособна и нет смысла нести дополнительные расходы, связанные с его выполнением, и терпеть неудобства, наблюдая отладочный вывод в завершенном продукте. По этой причине код, который вы добавляете только для отладки, работает в отладочной версии программы, но не в рабочей версии (если конечно, она правильно реализована).

Вывод, создаваемый отладочным кодом, должен вскрывать причины возникновения ошибок, и если вы как следует продумаете его реализацию, способ встраивания его в вашу программу, то с его помощью легко получите представление о том, в какой части программы следует искать ошибку. Затем можно применить отладчик, чтобы точно найти причину и местонахождение ошибки, после чего устранить ее.

Первый способ, с помощью которого можно проверить поведение программы, обеспечивается библиотечной функцией С++

Использование Утверждений

Файл заголовка стандартной библиотеки cassert объявляет функцию assert(), которую можно использовать для проверки логических условий в программе, когда не определен специальный символ препроцессора NDEBUG. Эта функция объявлена следующим образом

В С++, как и в С, нет встроенных в язык средств ввода-вывода.

В С для этих целей используется библиотека stdio.h .
В С++ разработана новая библиотека ввода-вывода iostream , использующая концепцию объектно-ориентированного программирования:

Библиотека iostream определяет три стандартных потока:

Для их использования в Microsoft Visual Studio необходимо прописать строку:

Для выполнения операций ввода-вывода переопределены две операции поразрядного сдвига:

Возможно многократное назначение потоков:
cout

Ввод информации

При этом из входного потока читается последовательность символов до пробела, затем эта последовательность преобразуется к типу идентификатора, и получаемое значение помещается в идентификатор:

Возможно многократное назначение потоков:
cin >> переменная1 >> переменная2 >>. >> переменнаяn;

При наборе данных на клавиатуре значения для такого оператора должны быть разделены символами (пробел,
, ).

Особого внимания заслуживает ввод символьных строк. По умолчанию потоковый ввод cin вводит строку до пробела, символа табуляции или перевода строки.

Для ввода текста до символа перевода строки используется манипулятор потока getline() :

Манипуляторы потока

В С++ имеется ряд манипуляторов. Рассмотрим основные:

Пример Программа ввода-вывода значения переменной в C++

Та же программа, написанная на языке Си

Пример Использование форматированного вывода

Еще один пример использования форматированного вывода: для t∈[0;3] с шагом 0,5 вычислить значение y=cos(t).

Мне надо в выводе шесть 0, на С это будет так:

Как это можно на плюсах оформить?

1 ответ 1

Всё ещё ищете ответ? Посмотрите другие вопросы с метками c++ или задайте свой вопрос.

Похожие

Для подписки на ленту скопируйте и вставьте эту ссылку в вашу программу для чтения RSS.

дизайн сайта / логотип © 2019 Stack Exchange Inc; пользовательское содержимое попадает под действие лицензии cc by-sa 4.0 с указанием ссылки на источник. rev 2019.11.15.35459

Я относительно новичок в мире C ++.
я знаю std::cout используется для вывода на консоль в C ++. Но рассмотрим следующий код на C:

Как добиться аналогичного форматирования значения типа double с точностью до 2 десятичных знаков, используя cout в С ++?

Я знаю, что C ++ обратно совместим с C. Но есть ли в C ++ эквивалент printf (), если так, то где он определяется?

Решение

Это то, что вы хотите:

Другие решения

Есть нет эквивалент. Это боль, используя cout для форматированного вывода.

Все предлагаемые решения звонят setprecision и подобные ужасны при использовании длинных форматов.

boost::format не поддерживает некоторые очень хорошие функции. Несовместимость с printf . Я все еще использую printf потому что это непобедимо.

Если вы действительно хотите использовать те же методы форматирования, что и в C, вы можете использовать Повысьте :: формат , который делает именно это:

Но есть ли эквивалент printf () в C ++, если так, то где он определен?

Есть предложение по стандартам P0645 добавить аналогичное средство форматирования в C ++. В то же время вы можете использовать библиотека который реализует это предложение и многое другое:

P0645 и используют синтаксис строки формата, подобный Python, который похож на printf х но использует <> в качестве разделителей вместо % ,

Также информация о типе сохраняется, поэтому вам не нужно l или другие шумовые характеристики.

Сохраните вашу программу как CPP и запустить его.

Он запускает и печатает ответ.

Потому что C ++ также имеет printf() а также scanf() лайк C ,

Вы также можете использовать sprintf в C ++, чтобы «напечатать» строку, а затем вырезать эту строку. Эта стратегия использует ваш опыт форматирования в стиле printf.

Если вы хотите использовать printf как форматирование вы, вероятно, должны использовать snprintf (или построить распределительный вариант этого поверх этого). Обратите внимание, что sprintf требует, чтобы вы были в состоянии гарантировать, что результат не превысит буфер, в котором вы должны сохранять определенное поведение. С snprintf с другой стороны, можно гарантировать, что он не будет переполнять буфер, так как вы указываете максимальное количество символов, которое будет записано в строку (вместо этого он усекает вывод).

Вы могли бы даже построить что-то, что можно напрямую подавать на ostream на вершине snprintf автоматически распределяя буфер и помещая в объект, который при уничтожении освобождает эту память. Это в дополнение к способу подачи объекта на ostream закончил бы это. Что-то вроде (с местом для улучшений):

тогда вы используете это как:

Если вы используете библиотеки GNU, вы, конечно, можете использовать printf непосредственно с cout а также stdout один и тот же объект тогда. В противном случае вам следует избегать смешивания stdio а также iostreams поскольку нет никакой гарантии, что они синхронизированы друг с другом.

Чтобы вывести значение на консоль с помощью C ++, вам нужен глобальный объект ostream соиЬ и заголовочный файл Вы также можете использовать различные флаги форматирования для управления представлением вывода …

Читайте также: