Урок 7. Самые распространенные проблемы в С++. Решения

   ⁄ 

 Обновлено 12 Мар 2018  ⁄ 

 ⁄   8 

⁄   9440

В этом уроке мы разберем несколько наиболее частых проблем, с которыми сталкиваются новички в C++.

Проблема 1

Как использовать русский язык в консоли C++?

Ответ

По умолчанию в консоли C++ русский язык не используется, чтобы его использовать вам нужно будет подключить заголовочный файл Windows.h:

И прописать следующие две строчки в функции main():

Проблема 2

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

Ответ



Некоторые компиляторы (например, Bloodshed’s Dev C++) автоматически не задерживают консольное окно после того, как программа завершает своё выполнение. Если проблема в компиляторе, то следующие два шага решат эту проблему:

Во-первых, добавьте следующую строчку кода в верхнюю часть вашей программы:

Во-вторых, добавьте следующий код в конец функции main() (прямо перед оператором return):

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

Другие решения, такие как system("pause");, могут работать только на определенных операционных системах, поэтому вариант выше использовать предпочтительнее.

Примечание: Visual Studio не задерживает консольное окно, если выполнение запущено с отладкой (Debug Menu > Start Debugging). Если вы хотите, чтобы была пауза — воспользуйтесь решением выше или запустите программу без отладки (Debug Menu > Start Without Debugging).

Проблема 3

При компиляции в Microsoft Visual C++ я получаю следующую ошибку:
«c:vcprojectstest.cpp(263) :fatal error C1010: unexpected end of file while looking for precompiled header directive».

Ответ

Эта ошибка появляется, когда компилятор Microsoft Visual C++ использует предварительно скомпилированные заголовки (precompiled headers), что является таковым по умолчанию. Для устранения этой проблемы, вам нужно просто найти файл, в котором есть эта ошибка и добавить следующую строчку кода на первое место в вашем файле (разместить на первой строке):

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

Проблема 4

При использовании cin, cout или endl компилятор говорит, что cin, cout или endl являются «undeclared identifier» (необъявленными идентификаторами).

Ответ

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

Во-вторых, убедитесь, что cin, cout или endl имеют префикс “std::”. Например:

Проблема 5

При использовании endl для перехода на новую строку, появляется ошибка, что end1 является «undeclared identifier».

Ответ

Убедитесь, что вы не спутали букву l (нижний регистр L) в endl с цифрой 1. В endl – всё буквы. Рекомендуется использовать шрифт, в котором хорошо видны различия между буквой L в нижнем регистре, буквой i в верхнем регистре и цифрой 1. Также легко можно спутать заглавную букву О с цифрой 0 (нуль).

Проблема 6

Моя программа компилируется, но работает не так как нужно. Что мне делать?



Ответ

Проводите отладку программу. Детальнее об этом в уроке 26 и уроке 27.

Проблема 7

Как включить нумерацию строк в Visual Studio?

Ответ

Перейдите в меню Tools и выберите Options. Дальше выберите Text Editor > All Languages (или C/C++) и поставьте галочку возле Line numbers. Затем ОК.

Проблема 8

При компиляции программы я получаю ошибку: «unresolved external symbol _main or _WinMain@16».

Ответ

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

Здесь есть несколько пунктов, которые нужно проверить:

  есть ли в вашем коде функция main()?

  слово main написано правильно?

  включен ли файл, который содержит функцию main(), в ваш проект (если нет, то переместите функцию main() в файл, который является частью вашего проекта, либо добавьте этот файл в ваш проект)?

  подключен ли файл, содержащий функцию main(), к компиляции?

Проблема 9

При компиляции программы я получаю предупреждение: “Cannot find or open the PDB file”.

Ответ

Это не ошибка, а предупреждение. На работоспособность вашей программы оно не повлияет. Тем не менее, вы можете решить всё следующим образом: перейдите в меню Debug > Options > Debugging > Symbols и поставьте галочку возле Microsoft Symbol Server.

Проблема 10

Я использую Code::Blocks или G++ в командной строке и ни одна из функциональных возможностей C++11 не работает.

Ответ

Для Code::Blocks, перейдите в Project > Build options > Compiler settings > Compiler flags и поставьте галочку возле пункта Have g++ follow C++11 ISO C++ language standard. Смотрите урок 4. Там есть скриншоты, как это сделать.

При компиляции в g++, добавьте следующий код в командную строку:

-std=c++11

Проблема 11

Я использую Visual Studio и получил следующую ошибку: «1>MSVCRTD.lib(exe_winmain.obj) : error LNK2019: unresolved external symbol _WinMain@16 referenced in function “int __cdecl invoke_main(void)” (?invoke_main@@YAHXZ)».

Ответ

Скорее всего, вы выбрали неверный тип проекта. Убедитесь, что вы создали консольное приложение — Win32 Console Application, а не проект — Win32 Project.

Проблема 12

Я запустил программу, появилось окно, но ничего не выводится.

Ответ

Ваш антивирус может блокировать выполнение. Попробуйте отключить его и запустите программу еще раз.

У меня есть другая проблема, с которой я не могу разобраться. Как и где можно получить ответ?

Ответ

По мере прохождения уроков, у вас, несомненно, появятся вопросы или вы столкнетесь с неожиданными проблемами. Что делать?

Во-первых, спросите Google. Четко сформулируйте вашу проблему и просто погуглите. Если у вас есть сообщение об ошибке — скопируйте его и вставьте в поиск Google, используя кавычки. Скорее всего, кто-то уже задал такой же вопрос, как у вас, и получил на него ответ.

Если Google не помог, то спросите на доске Q&A (questions/answersвопросы/ответы). Существуют целые веб-сайты, посвященные решению проблем, которые возникают при программировании. Например, Stack Overflow. Попробуйте задать свой вопрос там. Но будьте внимательны и старайтесь максимально конкретизировать свою проблему, а также не забудьте указать, какую ОС и IDE вы используете.

Оценить статью:

Звёзд: 1Звёзд: 2Звёзд: 3Звёзд: 4Звёзд: 5 (75 оценок, среднее: 4,96 из 5)
Загрузка...
Подписаться на обновления:

Комментариев: 8

  1. Анатолий:

    На другом ресурсе для кириллицы предлагают использовать setlocale(LC_ALL, "rus");,
    тут SetConsoleCP(1251); и SetConsoleOutputCP(1251);, в чем разница?

    1. Li4ik:

      В

      вы устанавливаете использование локальных параметров (в этом случае, русских). В

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

      1. SGS:

        В CodeBlocks при указании

        и прописывании в main()

        все равно пишет кракозябры вместо русских слов.
        Хотя при добавлении строчки

        русский определяется.
        Что делаю не так?

        1. Li4ik:

          Попробуйте изменить шрифт в консоли. По умолчанию в консоли стоит шрифт Consolas (у вас может быть другой) — он и может препятствовать корректному выводу/вводу кириллицы через SetConsole. Зайдите в консоль через cmd — ПКМ по верхней панели консоли — выберите «Свойства» — закладка «Шрифт» — установите в качестве шрифта Lucida Console — затем «ОК».

        2. SGS:

          Работает.
          Спасибо!

        3. Li4ik:

          Пожалуйста 🙂

  2. Александр:

    Вы пишите в коде std :: cout<<, std :: cin >>.
    А можно написать using namespace std; и не писать по всему коду std ::
    Это зависит от привычки (инд. почерка) или есть какой то секрет ?
    Спасибо.
    P.S. Пришел к Вам с другого сайта, у Вас более доходчиво.

    1. Li4ik:

      Можно, но есть нюансы. Об этом подробно в 54 уроке.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

ПОДПИСЫВАЙТЕСЬ

НА КАНАЛ RAVESLI В TELEGRAM

@ravesli

ПОДПИСАТЬСЯ БЕСПЛАТНО