Установка поддержки C и C++ в Visual Studio
Если вы еще не скачали и не установили Visual Studio и инструменты Microsoft C/C++, выполните следующее.
Установка Visual Studio 2022
Вас приветствует Visual Studio 2022! В этой версии можно легко выбрать и установить только необходимые компоненты. Поскольку она занимает меньше памяти, она быстро устанавливается и при установке меньше влияет на систему.
Этот раздел относится к установке Visual Studio в Windows. Visual Studio Code — это упрощенная среда кроссплатформенной разработки, работающая в системах Windows, Mac и Linux. Расширение Microsoft C/ C++ для Visual Studio Code поддерживает технологию IntelliSense, отладку, форматирование кода, автоматическое завершение. Visual Studio для Mac не поддерживает Microsoft C++, но поддерживает языки .NET и кроссплатформенную разработку. Инструкции по установке см. в разделе Установка Visual Studio для Mac.
Хотите ознакомиться с другими новыми возможностями этой версии? См. заметки о выпуске Visual Studio.
Готовы к установке? Мы пошаговые инструкции.
Шаг 1. Подготовка компьютера к установке Visual Studio
Перед началом установки Visual Studio:
- Проверьте требования к системе. Так вы узнаете, может ли ваш компьютер поддерживать Visual Studio 2022.
- Примените актуальные обновления Windows. Эти обновления гарантируют, что на компьютере установлены последние обновления для системы безопасности и необходимые системные компоненты для Visual Studio.
- Перезапуск. Перезагрузка гарантирует, что ожидающие установки или обновления компоненты не будут препятствовать установке Visual Studio.
- Освободите место. Удалите ненужные файлы и приложения с системного диска. Например, запустите приложение очистки диска.
Сведения об использовании предыдущих версий Visual Studio параллельно с Visual Studio 2022 см. в разделе Целевая платформа и совместимость для Visual Studio 2022.
Шаг 2.Скачивание Visual Studio
Теперь скачайте файл начального загрузчика Visual Studio. Для этого нажмите приведенную ниже кнопку, чтобы перейти на страницу скачивания Visual Studio. Выберите выпуск Visual Studio и нажмите кнопку Бесплатная пробная версия или Скачать бесплатно.
Шаг 3. Установка установщика Visual Studio
Запустите скачанный файл начального загрузчика, чтобы установить Visual Studio Installer. Новый установщик имеет меньший размер и включает все необходимое для установки и настройки Visual Studio.
- В папке Загрузки дважды щелкните файл начального загрузчика, имя которого совпадает с именем одного из следующих файлов или похоже на них:
- vs_community.exe для Visual Studio Community.
- vs_professional.exe для Visual Studio Professional;
- vs_enterprise.exe для Visual Studio Enterprise;
Если появляется оповещение системы контроля учетных записей, нажмите кнопку Да, чтобы запустить начальный загрузчик.
Шаг 4. Выбор рабочих нагрузок
Когда завершится установка программы установки, вы можете с ее помощью выбрать нужные рабочие нагрузки или наборы функций. Это делается следующим образом.

- Найдите нужную рабочую нагрузку на экране Установка Visual Studio. Для поддержки C и C++ выберите рабочую нагрузку «Разработка классических приложений на C++». В нее входит основной редактор кода по умолчанию, который предоставляет базовую поддержку редактирования кода для более чем 20 языков, возможность открывать и изменять код в любой папке без наличия проекта и интегрированное управление исходным кодом. Другие рабочие нагрузки поддерживают дополнительные виды разработки. Например, выберите рабочую нагрузку «Разработка приложений для универсальной платформы Windows», чтобы создать приложения, использующие среду выполнения Windows для Microsoft Store. Выберите «Разработка игр на C++», чтобы создать игры, использующие DirectX, Unreal и Cocos2d. Выберите «Разработка приложений для Linux на C++» для целевых платформ Linux, включая разработку приложений Интернета-вещей. В области Сведения об установке перечислены включенные и необязательные компоненты, устанавливаемые каждой рабочей нагрузкой. В этом списке можно выбрать или отменить выбор дополнительных компонентов. Например, чтобы обеспечить поддержку разработки с помощью наборов инструментов компилятора Visual Studio 2017 или 2015, выберите дополнительные компоненты MSVC v141 или MSVC v140. Вы можете добавить поддержку MFC, расширение языка экспериментальных модулей, IncrediBuild и многое другое.
- Выбрав нужные рабочие нагрузки и дополнительные компоненты, нажмите Установить. Далее будут отображаться экраны состояния, на которых демонстрируется ход установки Visual Studio.
В любой момент после установки можно установить рабочие нагрузки или компоненты, которые не были установлены изначально. Если среда Visual Studio открыта, выберите пункт Сервис>Получить средства и компоненты. ; откроется Visual Studio Installer. Visual Studio Installer можно также открыть из меню «Пуск». Здесь можно выбрать рабочие нагрузки или компоненты, которые нужно установить. Затем выберите Изменить.
Шаг 5. Выбор отдельных компонентов (необязательно)
Если вы не хотите использовать функцию «Рабочие нагрузки», чтобы настроить установку Visual Studio или добавить дополнительные компоненты, чем установка рабочей нагрузки, можно сделать это, установив или добавив отдельные компоненты на вкладке «Отдельные компоненты». Выберите нужные компоненты, а затем следуйте инструкциям.
Шаг 6. Установка языковых пакетов (необязательно)
По умолчанию при первом запуске установщик пытается использовать язык операционной системы. Чтобы установить Visual Studio на нужном языке, выберите в Visual Studio Installer вкладку Языковые пакеты и следуйте указаниям.
Изменение языка установщика из командной строки
Язык по умолчанию можно изменить еще одним способом — запустив установщик из командной строки. Например, можно принудительно запустить установщик на английском языке, выполнив команду vs_installer.exe —locale en-US . Программа установки запомнит этот параметр и использует его при следующем запуске. Установщик поддерживает следующие токены языков: zh-cn, zh-tw, cs-cz, en-us, es-es, fr-fr, de-de, it-it, ja-jp, ko-kr, pl-pl, pt-br, ru-ru и tr-tr.
Шаг 7. Изменение расположения установки (дополнительно)
Вы можете уменьшить место, занимаемое установкой Visual Studio на системном диске. Вы можете переместить кэш загрузки, общие компоненты, пакеты SDK и средства на другие диски и оставить Visual Studio на самом быстром диске.
Вы можете выбрать другой диск только в том случае, если вы устанавливаете Visual Studio впервые. Если вы уже установили ее и хотите изменить диск, необходимо удалить Visual Studio, а затем переустановить ее.
Шаг 8. Начало разработки
- Когда установка Visual Studio завершится, нажмите кнопку Запустить, чтобы приступить к разработке в Visual Studio.
- На начальном экране выберите Создать проект.
- В поле поиска введите тип приложения, которое вы хотите создать, чтобы просмотреть список доступных шаблонов. Список шаблонов зависит от рабочих нагрузок, выбранных во время установки. Чтобы просмотреть различные шаблоны, выберите разные рабочие нагрузки. Можно также фильтровать поиск по определенному языку программирования с помощью раскрывающегося списка Язык. Вы также можете выбирать фильтры из списка Платформа и Тип проекта.
- Новый проект откроется в Visual Studio, и вы можете приступить к написанию кода!
Установка Visual Studio 2019
Вас приветствует Visual Studio 2019! В этой версии можно легко выбрать и установить только необходимые компоненты. Поскольку она занимает меньше памяти, она быстро устанавливается и при установке меньше влияет на систему.
Этот раздел относится к установке Visual Studio в Windows. Visual Studio Code — это упрощенная среда кроссплатформенной разработки, работающая в системах Windows, Mac и Linux. Расширение Microsoft C/ C++ для Visual Studio Code поддерживает технологию IntelliSense, отладку, форматирование кода, автоматическое завершение. Visual Studio для Mac не поддерживает Microsoft C++, но поддерживает языки .NET и кроссплатформенную разработку. Инструкции по установке см. в разделе Установка Visual Studio для Mac.
Хотите ознакомиться с другими новыми возможностями этой версии? См. заметки о выпуске Visual Studio.
Готовы к установке? Мы пошаговые инструкции.
Шаг 1. Подготовка компьютера к установке Visual Studio
Перед началом установки Visual Studio:
- Проверьте требования к системе. Так вы узнаете, поддерживает ли ваш компьютер Visual Studio 2019.
- Примените актуальные обновления Windows. Эти обновления гарантируют, что на компьютере установлены последние обновления для системы безопасности и необходимые системные компоненты для Visual Studio.
- Перезапуск. Перезагрузка гарантирует, что ожидающие установки или обновления компоненты не будут препятствовать установке Visual Studio.
- Освободите место. Удалите ненужные файлы и приложения с системного диска. Например, запустите приложение очистки диска.
Сведения об использовании предыдущих версий Visual Studio параллельно с Visual Studio 2019 см. в разделе Целевая платформа и совместимость для Visual Studio 2019.
Шаг 2.Скачивание Visual Studio
Теперь скачайте файл начального загрузчика Visual Studio. Для этого нажмите приведенную ниже кнопку, чтобы перейти на страницу скачивания Visual Studio. Нажмите кнопку «Скачать», а затем выберите нужный выпуск Visual Studio.
Шаг 3. Установка установщика Visual Studio
Запустите скачанный файл начального загрузчика, чтобы установить Visual Studio Installer. Новый установщик имеет меньший размер и включает все необходимое для установки и настройки Visual Studio.
- В папке Загрузки дважды щелкните файл начального загрузчика, имя которого совпадает с именем одного из следующих файлов или похоже на них:
- vs_community.exe для Visual Studio Community.
- vs_professional.exe для Visual Studio Professional;
- vs_enterprise.exe для Visual Studio Enterprise;
Если появляется оповещение системы контроля учетных записей, нажмите кнопку Да, чтобы запустить начальный загрузчик.
Шаг 4. Выбор рабочих нагрузок
Когда завершится установка программы установки, вы можете с ее помощью выбрать нужные рабочие нагрузки или наборы функций. Это делается следующим образом.

- Найдите нужную рабочую нагрузку на экране Установка Visual Studio. Для поддержки C и C++ выберите рабочую нагрузку «Разработка классических приложений на C++». В нее входит основной редактор кода по умолчанию, который предоставляет базовую поддержку редактирования кода для более чем 20 языков, возможность открывать и изменять код в любой папке без наличия проекта и интегрированное управление исходным кодом. Другие рабочие нагрузки поддерживают дополнительные виды разработки. Например, выберите рабочую нагрузку «Разработка приложений для универсальной платформы Windows», чтобы создать приложения, использующие среду выполнения Windows для Microsoft Store. Выберите «Разработка игр на C++», чтобы создать игры, использующие DirectX, Unreal и Cocos2d. Выберите «Разработка приложений для Linux на C++» для целевых платформ Linux, включая разработку приложений Интернета-вещей. В области Сведения об установке перечислены включенные и необязательные компоненты, устанавливаемые каждой рабочей нагрузкой. В этом списке можно выбрать или отменить выбор дополнительных компонентов. Например, чтобы обеспечить поддержку разработки с помощью наборов инструментов компилятора Visual Studio 2017 или 2015, выберите дополнительные компоненты MSVC v141 или MSVC v140. Вы можете добавить поддержку MFC, расширение языка экспериментальных модулей, IncrediBuild и многое другое.
- Выбрав нужные рабочие нагрузки и дополнительные компоненты, нажмите Установить. Далее будут отображаться экраны состояния, на которых демонстрируется ход установки Visual Studio.
В любой момент после установки можно установить рабочие нагрузки или компоненты, которые не были установлены изначально. Если среда Visual Studio открыта, выберите пункт Сервис>Получить средства и компоненты. ; откроется Visual Studio Installer. Visual Studio Installer можно также открыть из меню «Пуск». Здесь можно выбрать рабочие нагрузки или компоненты, которые нужно установить. Затем выберите Изменить.
Шаг 5. Выбор отдельных компонентов (необязательно)
Если вы не хотите использовать функцию «Рабочие нагрузки», чтобы настроить установку Visual Studio или добавить дополнительные компоненты, чем установка рабочей нагрузки, можно сделать это, установив или добавив отдельные компоненты на вкладке «Отдельные компоненты». Выберите нужные компоненты, а затем следуйте инструкциям.

Шаг 6. Установка языковых пакетов (необязательно)
По умолчанию при первом запуске установщик пытается использовать язык операционной системы. Чтобы установить Visual Studio на нужном языке, выберите в Visual Studio Installer вкладку Языковые пакеты и следуйте указаниям.

Изменение языка установщика из командной строки
Язык по умолчанию можно изменить еще одним способом — запустив установщик из командной строки. Например, можно принудительно запустить установщик на английском языке, выполнив команду vs_installer.exe —locale en-US . Программа установки запомнит этот параметр и использует его при следующем запуске. Установщик поддерживает следующие токены языков: zh-cn, zh-tw, cs-cz, en-us, es-es, fr-fr, de-de, it-it, ja-jp, ko-kr, pl-pl, pt-br, ru-ru и tr-tr.
Шаг 7. Изменение расположения установки (дополнительно)
Вы можете уменьшить место, занимаемое установкой Visual Studio на системном диске. Вы можете переместить кэш загрузки, общие компоненты, пакеты SDK и средства на другие диски и оставить Visual Studio на самом быстром диске.

Вы можете выбрать другой диск только в том случае, если вы устанавливаете Visual Studio впервые. Если вы уже установили ее и хотите изменить диск, необходимо удалить Visual Studio, а затем переустановить ее.
Шаг 8. Начало разработки
- Когда установка Visual Studio завершится, нажмите кнопку Запустить, чтобы приступить к разработке в Visual Studio.
- На начальном экране выберите Создать проект.
- В поле поиска введите тип приложения, которое вы хотите создать, чтобы просмотреть список доступных шаблонов. Список шаблонов зависит от рабочих нагрузок, выбранных во время установки. Чтобы просмотреть различные шаблоны, выберите разные рабочие нагрузки. Можно также фильтровать поиск по определенному языку программирования с помощью раскрывающегося списка Язык. Вы также можете выбирать фильтры из списка Платформа и Тип проекта.
- Новый проект откроется в Visual Studio, и вы можете приступить к написанию кода!
Установка Visual Studio 2017
В Visual Studio 2017 можно с легкостью выбрать и установить только необходимые компоненты. Поскольку она занимает меньше памяти, она быстро устанавливается и при установке меньше влияет на систему.
Необходимые компоненты
- Широкополосное подключение к Интернету. Установщик Visual Studio может загрузить несколько гигабайт данных.
- Компьютер под управлением Microsoft Windows 7 или более поздних версий. Мы рекомендуем использовать последнюю версию Windows для более удобной разработки. Прежде чем устанавливать Visual Studio, убедитесь, что в системе установлены последние обновления.
- Проверьте, что на диске достаточно свободного места. Для работы Visual Studio требуется не менее 7 ГБ дискового пространства, однако может потребоваться 50 ГБ или более, если установлены многие дополнительные компоненты. Рекомендуем установить Visual Studio на диск C.
Дополнительные сведения о дисковом пространстве и требованиях к операционной системе см. в разделе Требования к системе для семейства продуктов Visual Studio. Установщик сообщает, сколько места на диске требуется для установки выбранных дополнительных компонентов.
Загрузка и установка
- Чтобы скачать последнюю версию установщика Visual Studio 2017 для Windows, перейдите на страницу для скачивания более ранних версий Microsoft Visual Studio. Разверните раздел 2017 и нажмите кнопку Загрузка.
Совет Выпуск Community предназначен для индивидуальных разработчиков, использования при аудиторном обучении и в научных исследованиях, а также разработки решений с открытым кодом. В других целях установите Visual Studio 2017 Professional или Visual Studio 2017 Enterprise.
Выберите рабочую нагрузку Разработка классических приложений на C++, а затем нажмите Установить.
Если он выделен, выберите его, чтобы открыть окно Уведомления. Если для Visual Studio доступны какие либо обновления, рекомендуется установить их на этом этапе. После завершения установки перезапустите Visual Studio.Установка Visual Studio 2015
Чтобы установить Visual Studio 2015, перейдите на страницу для скачивания более ранних версий Microsoft Visual Studio. Разверните раздел 2015 и нажмите кнопку Загрузка. Запустите скачанную программу установки и щелкните Выборочная установка, а затем выберите компонент C++. Чтобы добавить поддержку C и C++ в существующую установку Visual Studio 2015, нажмите кнопку «Пуск» Windows и введите Установка и удаление программ. Откройте программу из списка результатов и найдите установку Visual Studio 2015 в списке установленных программ. Дважды щелкните ее, а затем выберите Изменить и выберите компоненты Visual C++ для установки.
Как правило, рекомендуется использовать последнюю версию Visual Studio, даже если вам нужно скомпилировать код в компиляторе Visual Studio 2015. Дополнительные сведения см. в разделе Использование собственного многоплатформенного нацеливания в Visual Studio для сборки старых проектов.
После запуска Visual Studio можно переходить к следующему шагу.
Как собрать Си программу в OS Windows

Иногда возникает ситуация, когда надо что‑то посчитать согласно сложному алгоритму прямо на LapTop/NetTop/DeskTop PC. При этом этот алгоритм написан на Си. Это может быть цифровой фильтр, дискретное преобразование Фурье, генератор QR кода, кусок линейной алгебры с векторами, какое‑то тригонометрическое вычисление, программный модулятор, статистическая обработка случайной величины. Да всё, что угодно! То есть Вы хотите использовать язык Си как гибкий и быстрый калькулятор в Windows. Тут надо написать программу на Си.
Компьютер — это универсальный вычислитель
Или, например, Вы программируете микроконтроллеры на Си и хотите сделать симулятор прошивки в виде консольного приложения. Надо вам, например, прогнать модульные тесты платформа‑независимого кода на «большом компьютере». Потом Вам 80% вероятность, что понадобится конфигуратор прошивки по UART. Потом Вам понадобится консольное приложение Loader для загрузки по UART самой прошивки через BootLoader.
Потом понадобится крохотная PC‑утилита синхронизации для часов реального времени с PC.
Почему именно Си?
- Эту LapTop утилиту стоит писать на том же языке, что и прошивку хотя бы по той причине, что можно пере использовать кодовую базу из микроконтроллеров для программирования на DeskTop(е).
- Дело в том что язык программирования Си — это самый простой язык программирования из тех, что всё еще более или менее используется в промышленной разработке. По факту в Си только функции и переменные. Тут нет никаких виртуальных функций, шаблонов, делегатов и прочих концепций. В Си всё предельно просто и конкретно.
Разработка под PC это не сross компиляция, как в случае со сборкой артефактов для микроконтроллера, и тут в PC всё в какой‑то степени проще. При сборке Си приложения не надо думать о файле конфигурации компоновщика, как мы это привыкли делать для cross компиляции артефактов для микроконтроллеров (файлы *.ld).
Сперва определимся для какого Target(а) надо собрать бинарь. Надо узнать какой у нас на материнской плате установлен микропроцессор. Такую информацию может показать утилита CPUZ.

В данном случае у меня на одном компьютере Intel Celeron J4125 2Ghz, 4x cores, L1 32kByte, L2 4MByte, 10W. На другом компьютере установлен 64 разрядный микропроцессор AMD Ryzen 5 PRO 3400GE 3.30 GHz.

Но это даже не так важно. Важно какой у нас Instruction Set. В данном случае — x86–64. Это значит, что у нас 64-битный процессор. Получается, что у нас есть выбор: либо ставить 64-битный компилятор Си, либо накатывать 32-битный компилятор Си.
Когда мы пишем программу в Windows мы пишем программу не для микропроцессора. Мы пишем программу для операционной системы. Это главное отличие от программирования для микроконтроллера. Там мы писали монолитную программу для конкретного микропроцессорного ядра (ARM-Cortex M33 или PowerPC). Тут же как правило, нам приходится работать на разных процессорах, однако мы в OS Windows этого даже не замечаем.
Units:
text
bit
N
N
kByte
kByte
MByte
Процессор
bitness
cores
Threads
L1
L2
L3
AMD Ryzen 5 PRO 3400GE
Intel Celeron J4125
Intel Core i7 8550U
Одновременно с этим наш имитатор прошивки должен собираться и запускаться на всех окружениях настольных компьютеров: на работе, дома, в гараже.
Как и в любом деле сначала надо определится с терминологией.
Терминология
Компилятор — программа, переводящая написанный на языке программирования читаемый понятный человеком текст, в набор машинных кодов (человеко‑нечитаемый бинарный код). Программисты это люди, которые как никто приближены к абстракциям. Любой язык программирования, в частности Си — это уровень на коротком можно не думать о наборе команд данного микропроцессора. У процессора нет никаких переменных и функций. Переменные существуют только в сознании программиста. Поэтому нам нужен компилятор Си. Компилятор для каждого Cи файлика производит *.o файлик с родным для данного процессора машинным кодом.
Компоновщик (Linker)— утилита, которая склеивает бинарные файлы *.o в один монолитный исполняемый бинарный файл программы. В нашем случае это *.exe.
Артефакт — результат работы ToolChain(а). В нашем случае это *.exe файл с бинарным файлом программы.
Что надо из софтвера?
Текстовый редактор (Text Editor)
Прежде всего нужен какой‑то текстовый редактор, чтобы написать этот самый исходный текст программы на Си. Тут вариантов масса. NotePad++, Eclipse, MS VS Code.
Сборщик (Build Tools)
В компьютерах ничего само собой не происходит. Компьютеры — это самые ленивые и безынициативные сущности. Им всё надо объяснять максимально подробно и понятно. Поэтому надо явно указать из каких *.с файлов мы хотим собирать программу. Эти файлы надо как-то перечислить проиндексировать. Для этого была создана специальная утилита называемая make. Идея проста. Создается текстовый файл (Makefile) и в нем прописывается правильная последовательность вызова консольных утилит, которая приведет к тому, что на жестком диске появится исполняемый файл с программой.
Препроцессор (Preprocessor)
Это такая консольная утилита (cpp.exe), которая вставляет и заменяет куски текста. Нужна чисто ради удобства написание текста. Препроцессор позволяет полностью исключить такое нехорошее явление как дублирование программного кода. При этом препроцессору абсолютно всё равно с каким языком программирования работать (Cи, C++, DeviceTree, Graphviz, скрипты компоновки и т. п.). Для препроцессора любой язык программирования — это просто текст.
Теперь рассмотрим практические аспекты.
Какой выбрать компилятор Си кода?
Тут есть несколько бесплатных вариантов на выбор.
Компилятор
разрядность генерируемого кода
Tiny C Compiler
Для программистов микроконтроллеров я настоятельно рекомендую выбрать именно MinGW. Дело в том, что MinGW генерирует 32-битный код. Это как раз соответствует тому, что большинство микроконтроллеров (например ARM Cortex Mx) как раз 32-битные. И Вы так достигните большей совместимости между кодом прошивки микроконтроллера и консольным приложением в Windows.
Вторая причина по которой надо использовать компилятор C:\MinGW\bin\gcc.exe заключается в том, что в окружении MinGW есть заголовочный файл conio.h, который определяет функцию kbhit(). Это нам понадобится для имитации на PC текстового терминала UART-CLI консоли в stdout/stdin.
>C:\MinGW\bin\gcc.exe --version gcc.exe (MinGW.org GCC-6.3.0-1) 6.3.0 Copyright (C) 2016 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
Набор утилит MinGW преспокойно скачивается и устанавливается как любая другая программа под OS Windows.
Компоновщик (Linker)
Компоновкой занимается утилита ld, которая вызывает collect2. Именно утилита collect2.exe будет выдавать ошибки, если Вы будите вызывать функции без определения их тела.
Что вообще надо из софтвера?
Вот минимальный джентельменский набор для того чтобы собрать программу на Си.
Назначение утилиты
Название утилиты
Консольная утилита для удаления файлов или папок
Утилита управления ToolChain(ом). Она решает что и в какой последовательности собирать, чтобы получить артефакты
Утилита анализа получившегося бинаря. Аналог readelf.exe из мира программирования микроконтроллеров
Традиционно программы на Си собирают из make скриптов. Вот минималистический makefile для сборки много файлового Си‑проекта на Windows
MK_PATH:=$(dir $(realpath $(lastword $(MAKEFILE_LIST)))) #@echo $(error MK_PATH=$(MK_PATH)) INCDIR += -I$(MK_PATH) WORKSPACE_LOC:= $(MK_PATH)../../ $(info WORKSPACE_LOC= $(WORKSPACE_LOC)) INCDIR += -I$(WORKSPACE_LOC) BUILDDIR := $(MK_PATH)/Build SRC_PATH := $(dir $(abspath $(dir $$PWD) )) #@echo $(error SRC_PATH=$(SRC_PATH)) OBJDIR := $(SRC_PATH)obj # the compiler to use OPT += -DHAS_GCC CC = C:\MinGW\bin\gcc.exe # compiler flags: # -g adds debugging information to the executable file # -Wall turns on most, but not all, compiler warnings CFLAGS += -g #Generate code for 32-bit ABI CFLAGS += -m32 CFLAGS += -std=c11 -fshort-enums #CFLAGS += -Og CFLAGS += -O0 #CFLAGS += -Wall #CFLAGS +=-pedantic #CFLAGS += -ftime-report #files to link: LFLAGS += -static #LFLAGS += -lm EXECUTABLE=firmware_simulator_x86_m include $(MK_PATH)config.mk ifeq ($(CLI),Y) include $(MK_PATH)cli_config.mk endif ifeq ($(UNIT_TEST),Y) include $(MK_PATH)test_config.mk endif ifeq ($(UNIT_TEST),Y) include $(MK_PATH)diag_config.mk endif include $(WORKSPACE_LOC)code_base.mk #@echo $(error SOURCES_C= $(SOURCES_C)) INCDIR := $(subst /cygdrive/c/,C:/, $(INCDIR)) #@echo $(error INCDIR= $(INCDIR)) OBJ := $(patsubst %.c, %.o, $(SOURCES_C)) OBJ := $(subst /cygdrive/c/,C:/, $(OBJ)) #@echo $(error OBJ= $(OBJ)) .PHONY:all all:$(OBJ) $(EXECUTABLE) $(EXECUTABLE): $(OBJ) $(CC) $(CFLAGS) $(OBJ) $(LFLAGS) -o $(EXECUTABLE).exe %.o: %.c $(CC) $(CFLAGS) $(INCDIR) $(OPT) -c $< -o $@ clean: rm -r $(EXECUTABLE) $(OBJ)
Тут файлы config.mk, cli_config.mk, test_config.mk и diag_config.mk это просто файлы с перечислением набора переменных окружения для выборочной сборки конкретных исходников из общей кодовой базы. Вот корневой makefile для подключения разных программных компонентов code_base.mk
ifneq ($(CODE_BASE_MK),Y) CODE_BASE_MK=Y $(info CodeBase Config) #@echo $(error WORKSPACE_LOC=$(WORKSPACE_LOC)) INCDIR += -I$(WORKSPACE_LOC) ifeq ($(THIRD_PARTY),Y) include $(WORKSPACE_LOC)/third_party/third_party.mk endif ifeq ($(APPLICATIONS),Y) include $(WORKSPACE_LOC)/applications/applications.mk endif ifeq ($(CONNECTIVITY),Y) include $(WORKSPACE_LOC)/connectivity/connectivity.mk endif ifeq ($(CONTROL),Y) include $(WORKSPACE_LOC)/control/control.mk endif ifeq ($(COMPUTING),Y) #@echo $(error COMPUTING=$(COMPUTING)) include $(WORKSPACE_LOC)/computing/computing.mk endif ifeq ($(SENSITIVITY),Y) #@echo $(error SENSITIVITY=$(SENSITIVITY)) include $(WORKSPACE_LOC)/sensitivity/sensitivity.mk endif ifeq ($(STORAGE),Y) #@echo $(error STORAGE=$(STORAGE)) include $(WORKSPACE_LOC)/storage/storage.mk endif ifeq ($(UNIT_TEST),Y) include $(WORKSPACE_LOC)/unit_tests/unit_test.mk endif endif
Конечный make файл может выглядеть например так. Вот тут и индексируют конечные *.c файлы и определяют ключевые слова для препроцессора (начинаются на HAS_XXXXX).
$(info SCHMITT_TRIGGER_MK_INC=$(SCHMITT_TRIGGER_MK_INC)) ifneq ($(SCHMITT_TRIGGER_MK_INC),Y) SCHMITT_TRIGGER_MK_INC=Y mkfile_path := $(abspath $(lastword $(MAKEFILE_LIST))) $(info Build $(mkfile_path) ) SCHMITT_TRIGGER_DIR = $(COMPUTING_DIR)/schmitt_trigger INCDIR += -I$(SCHMITT_TRIGGER_DIR) SOURCES_C += $(SCHMITT_TRIGGER_DIR)/schmitt_trigger.c SCHMITT_TRIGGER=Y OPT += -DHAS_SCHMITT_TRIGGER ifeq ($(DIAG),Y) OPT += -DHAS_SCHMITT_TRIGGER_DIAG SOURCES_C += $(SCHMITT_TRIGGER_DIR)/schmitt_trigger_diag.c endif ifeq ($(CLI),Y) ifeq ($(SCHMITT_TRIGGER_COMMANDS),Y) OPT += -DHAS_SCHMITT_TRIGGER_COMMANDS SOURCES_C += $(SCHMITT_TRIGGER_DIR)/schmitt_trigger_commands.c endif endif endif
Если говорить метафорично, то Make - это как механическая коробка передач, только для сборки программ. C Make Вы можете буквально контролировать каждую опцию компилятора. Плюс Make в том, что за 60 лет своего существования это теперь самая разобранная и надежная технология из всего Computer Science.
При первой сборке проекта скорее всего выскочит вот эта ошибка. Это значит, что надо переустановить MinGW.
C:\Users\username\AppData\Local\Temp\ccT9XWou.s:54: Error: invalid instruction suffix for `push' C:\Users\username\AppData\Local\Temp\ccfvWBon.s:19: Error: invalid instruction suffix for `pop'
Надо чтобы команда gcc.exe -dumpmachine после установки показывала mingw32
>C:\MinGW\bin\gcc.exe -dumpmachine mingw32
Содержимое того Makefile можно представить в виде вот этой простенькой блок схемы ToolChain(а). Тут можно визуально проследить какой путь проходит *.с файл с момента написания до исполнения в Windows.

В остальном сборка на PC не отличается от сборки для микроконтроллера. В этом и достоинство сборки из Make. При работе с make cборка под любые процессоры выглядит плюс/минус одинаково. Просто по другому определенные переменные окружения: CC LD и т. п. Все те же *.mk файлы подтянутся что и в кодовой базе для прошивок.
Про то как происходит сборка прошивок из-под скриптов можно почитать в этом тексте:
Настройка ToolChain(а) для Win10+GCC+С+Makefile+ARM Cortex-Mx+GDB.
Когда собралась вся кодовая база бинарь получился всего 1,9MByte

Отладка имитатора прошивки
Артефактом сборки является файл *.exe. Его можно запустить вызвав его из командной строки cmd.

Тут происходит имитация UART-CLI терминала только вместо UART выступают файлы stdin (аналог UART-RX)/stdout (аналог UART-TX).
Можно заметить, что скорость исполнения приложения просто бешеная. За одну секунду супер-цикл успевает прокрутиться аж 11 240 590 раз! В микроконтроллерах это значение обычно было порядка 7588 раз.

Получается, что на PC приложение исполняется быстрее в 1481 раз. На три порядка быстрее!

Вывод
Сборка кода на Cи для DeskTop это весьма полезный навык при отладке микроконтроллерных прошивок. Можно отладить огромные куски платформа независимого кода: CRC, обработку строчек, триггер Шмитта, бинарные протоколы, и т.п.
Также можно собрать проект разными компиляторами: GCC, Clang. И тем самым найти и устранить больше ошибок в кодовой базе.
Как видите, в сборке Си программ на PC, ровным счетом, нет ничего сложного. Надеюсь этот текст поможет большему количеству программистов-микроконтроллеров отлаживать свои приложения на DeskTop PC и создавать, тем самым, отличные программные продукты.
Как правильно установить C на Windows 10?
Хочу разработать несколько простых программ (калькулятор, текстовый редактор) на C (именно C, а не C++) под Windows 7/10/11. Какой компилятор и как установить? P.S. Разнообразие компиляторов для C меня сбило с толку 🙂
Отслеживать
Дмитрий Краснов
задан 18 сен 2022 в 14:13
Дмитрий Краснов Дмитрий Краснов
88 8 8 бронзовых знаков
Ставьте Visual Studio 2022
18 сен 2022 в 15:21
@user7860670, я в вопросе указал, что мне нужен только компилятор C (хочу писать код в Visual Studio Code, а компилировать в терминале). Профессиональную IDE для создания простого калькулятора скачивать не планирую 🙂 Можно ли установить C, не скачивая Visual Studio 2022?
18 сен 2022 в 15:43
Visual Studio Code выходит тяжелее, чем Visual Studio и сложнее в использовании, особенно для новичков (вопросы по ней тут сыпятся регулярно). Но если интересно, то можно скачать и просто компилятор - Visual Studio Build Tools + Windows SDK.
18 сен 2022 в 16:30
Если нужен именно Си, не связывайтесь с продукцией MS - они не знают, что Си развивается и для него выходят новые стандарты. Смотрите в сторону реализаций gcc (mingw). Как вариант, под Windows можно установить MSYS2, а в нем через пакетный менеджер можно установить не только нужный компилятор, но и огромное количество библиотек из среды юниксов. Ну или, если кроме языка ничего не нужно, то еще можете посмотреть на Pelles C - это компактная среда разработки для одного языка и компилятор Си, который поддерживает стандарты до C17 (если не обманывают).
18 сен 2022 в 17:14
@Vladimir Модификатор z в printf поддерживается. VLA массивов к счастью нет и не будет, благо они теперь относятся к категории необязательных расширений.
Знакомство с языками C и C++
Для начала требуется установить среду разработки, в качестве которой будет использоваться интегрированная программная среда Code::Blocks. К основным преимуществам Code::Blocks относятся:
- свободная лицензия GPL v3.0, в частности, разрешается бесплатное распространение и использование;
- среда может работать в операционных системах семейств Windows, Linux, OS X (то есть является кросс-платформенной);
- возможность работы с различными компиляторами.
На сайте Code::Blocks в разделе Downloads можно найти информацию и ссылки на файлы для установки свежей версии этой среды разработки применительно к той или иной операционной системе.
Далее приводятся сведения об установке Code::Blocks версии 10.05. На момент написания данного текста эта версия является наиболее свежей из официально выпущенных.
1.2 Установка
1.2.1 Установка для операционной системы семейства Windows
1.2.1.1 Получение файла установки
Сначала необходимо скачать файл установки codeblocks-10.05mingw-setup.exe по ссылкам, указанным на странице "Download binary" сайта Code::Blocks. На момент написания данного текста указанный файл можно было взять либо здесь, либо здесь, либо здесь.
Этот файл устанавливает как саму среду Code::Blocks, так и среду MinGW, которая предоставляет компиляторы семейства GCC. Среда MinGW тоже относится к свободно распространяемому программному обеспечению.
1.2.1.2 Процесс установки
Надо запустить файл codeblocks-10.05mingw-setup.exe . Появится окно программы установки.

Надо нажать "Next". Появится окно с текстом свободной лицензии GPL v3.0.

Нажатие кнопки "I Agree" означает согласие с условиями лицензии и позволяет продолжит установку программы, в ходе которой далее появится окно выбора компонентов. В этом окне надо выбрать тип установки "Full: All plugins, all tools, just everything".

После этого надо нажать кнопку "Next". Появится окно с именем каталога для установки. Лучше, чтобы полное имя каталога не содержало пробелов и других букв, кроме латинских. Поэтому, например, имя C:\Program Files\CodeBlocks лучше заменить на другое, например, на C:\CodeBlocks или C:\Programs\CodeBlocks .

После этого можно нажать кнопку "Install", которая запускает собственно процесс установки.

По окончании процесса появится окно с вопросом о запуске Code::Blocks. Лучше здесь нажать "Нет", чтобы потом проверить запуск Code::Blocks обычным путем.

После этого достаточно будет нажать кнопку "Next", а потом "Finish", чтобы закончить процесс установки.


1.2.1.3 Первый запуск

Ярлык для запуска Code::Blocks должен появиться на панели быстрого запуска. Также аналогичный ярлык должен появиться на рабочем столе.
Code::Blocks можно запускать с помощью этих ярлыков, а также с помощью стандартного системного меню программ.
При первом запуске Code::Blocks должно появиться окно автоматического нахождения компилятора.

Заметьте, что в первой строке должно быть слово "Detected". Это означает, что найден компилятор. Надо нажать "OK". Процесс первого запуска продолжится, и будет запущена среда разработки. При этом появится окно с советом дня.

Если вы не хотите, чтобы это окно появлялось при каждом новом запуске Code::Blocks, то тогда уберите галочку "Show tips at startup в этом окне". Нажмите "Close", чтобы закрыть это окно.
После этого может появиться следующее окно.

Здесь лучше нажать "OK", чтобы файлы, относящиеся к C/C++, были связаны с Code::Blocks.
Также можно закрыть окно "Scripting console".

Теперь процесс первого запуска можно считать законченным, и на экране будет программная среда Code::Blocks.

1.2.2 Установка для операционной системы семейства Linux
В случае Linux можно установить Code::Blocks с помощью пакета для нужного дистрибутива среди перечисленных на этой странице.
Также можно попробовать поискать Code::Blocks в репозитории используемого дистрибутива Linux. Например, пакет Code::Blocks (10.05-1) имеется в репозитории Ubuntu 11.04.
1.3 Настройка
Для начала можно более компактно распределить панели инструментов в верхней части окна.

После этого надо сделать несколько изменений в базовых настройках.
Выберите меню "Settings=>Compiler and debugger…". Появится окно настроек.

В этом окне надо поставить галочку для "Produce debugging symbols". Это изменение позволит выполнять режим отладки, который будет рассмотрен в ходе одной из последующих лекций.
Не закрывая это окно, надо нажать вкладку "Other options".

И в поле редактирования надо добавить следующую строку.
-finput-charset=CP1251 -fexec-charset=CP866
Это позволить правильно отображать кириллицу в консоли в случае операционной системы семейства Windows. При использовании Code::Blocks в других операционных системах (например, в Linux) эту строку добавлять не надо.
Не закрывая это окно, надо нажать слева на рисунок с надписью "Debugger settings", а затем поставить галочку для "Evaluate expression under cursor".

После этого нажмите "OK". Все сделанные изменения должны вступить в силу.
2 Первый проект
2.1 Создание проекта
Теперь попробуем создать программу на языке C.
Для этого надо создать проект. Вообще, проект нужен для объединения в единое целое нескольких файлов. Но и для одного файла в данном случае удобнее сделать проект. Кроме того, в дальнейшем тогда будет привычнее работать именно с проектом.
Итак, для создания проекта выберите меню "File", затем в появившемся списке выберите "New", затем в появившемся списке выберите "Project" (для краткости подобное действие можно обозначить как "File=>New=>Project", и в дальнейшем будут использоваться такие более краткие обозначения). В итоге, должно появиться диалоговое окно.

В нем выберите "Console application" и нажмите "Go". Появится мастер создания проекта.

Нажмите "Next". Появится следующее окно.

Здесь надо выбрать C (а не C++) и нажать "Next". Появится следующее окно.

В строке "Project title" введите название проекта, например, Project01. Заметьте, что в строке "Project filenamе" (имя файла проекта) это название будет скопировано. Это имя файла можно изменить (чтобы оно отличалось от названия проекта), но для удобства лучше оставить их одинаковыми. Затем, в строке строки "Folder to create project in" (папка для создания в ней проекта) надо указать папку, где будет располагаться папка с проектом. Можно либо выбрать какую-нибудь папку из имеющихся с помощью кнопки "…", либо вручную набрать имя папки, например, C:\Projects .
Тогда именно в выбранной папке будет создана папка с названием проекта, где и будет расположен сам проект. Можете это проверить, обратив внимание на строку "Resulting filename".

При задании имени проекта и папки для проекта не допускайте использование имен папок с пробелами или буквами, которые не являются латинскими (строка "Resulting filename" не должна содержать пробелов в именах папок, а также не должна содержать других букв, кроме латинских).
Нажмите Next. Появится следующее окно.

Эти настройки оставьте без изменений. Нажмите "Finish". Проект будет создан.
В левой верхней части (в окне "Management") отобразится проект с папкой "Sources".

Надо нажать на "+" (или дважды нажать на папку) и эта папка откроется.

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

В окне редактирования будет текст первой программы с подсветкой. Обратите внимание, что для разных частей текста используются свои цвета, что облегчает чтение текста.
Это первая простейшая программа, которая выводит текст "Hello world!" ("Здравствуй, мир!"). Традиционно, именно такая программа используется в качестве первой программы при знакомстве с языком программирования. В случае Code::Blocks эта программа автоматически создается при создании нового проекта.
Размер шрифта в окне редактирования можно очень просто изменить. Для этого, вращайте колесо на мыши, удерживая нажатой клавишу Ctrl.
Еще можно использовать меню "Settings=>Editor" и, нажав в верхней правой части кнопку "Choose", поменять не только размер шрифта, но и сам шрифт. Только учтите, что для написания программ лучше использовать шрифты, у которых все буквы имеют одинаковую ширину. К таким шрифтам, к примеру, относятся шрифты: Courier New, Courier, Liberation Mono, Lucida Console, Monospace и др.
Если окажется, что на экране отсутствует окно "Management" или какое-нибудь другое нужное окно, то тогда надо выбрать меню View и в появившемся меню выбрать пункт, соответствующий нужному окну.
Если вдруг проект оказался закрытым, например, при выходе и повторном заходе в Code::Blocks, то его можно заново открыть. Для этого надо выбрать меню "File=>Recent projects", где, затем, в появившемся списке следует выбрать нужный проект. Либо можно использовать меню "File=>Open", после чего выбрать файл Project01.cbp .
2.2 Сборка и запуск программы
Эта программа будет детально рассмотрена чуть позже, а сейчас попробуем ее запустить.
Для этого должна быть выполнена компиляция текста программы (Compiling), и с помощью компоновки (Linking) должен быть создан исполняемый файл с расширением .exe , который и будет запускаться. Весь этот процесс компиляции и компоновки называется сборкой (Building).
Надо отметить, что процесс, обозначаемый здесь словом Compiling, также часто называют процессом трансляции. Есть разные варианты терминологии в этой области. Например, указанный выше процесс сборки может называться компиляцией, которая, свою очередь, состоит из этапов трансляции и компоновки. Но мы сейчас не будет углубляться в вопросы терминологии, и просто в качестве основы будем использовать англоязычный вариант терминов, естественно, с переводом на русский язык. Таким образом, мы будет говорить о сборке (Building), состоящей из этапов компиляции (Compiling) и компоновки (Linking). Этот вариант в данном случае кажется более удобным, так как в соответствующие наименования на английском языке можно наблюдать в окне сообщений процесса сборки.

Интегрированная среда разработки Code::Blocks позволяет автоматизировать сборку и запуск (Run) программы. Для сборки и запуска программы достаточно выполнить команду "Собрать и запустить" (Build and run), нажав кнопку или клавишу F9. Еще один вариант – это выбрать меню "Build=>Build and run".
В нижнем окне (сообщений о процессе сборки) будут появляться надписи "Compiling", "Linking" и т.д., что отражает ход компилирования и компоновки программы.

В результате должно появиться консольное окно, где в верхней части будет выведено предложение, указанное в программе в кавычках, а именно предложение "Hello world!".

Таким образом, программа выводит на экран заданную строку.
Под этой строкой будет две строки. Первая из них выдает код возврата программы и время, затраченное на выполнение программа. Вторая выдает сообщение о том, что для продолжения надо нажать любую клавишу. Эти две строки вырабатываются автоматически, если программа запускается из Code::Blocks.
Шрифт, используемый в консольном окне при необходимости можно поменять. Например, в случае операционной системы семейства Windows, для этого можно попробовать выполнить следующие действия.
Нажмите правой кнопкой мыши на значок в верхнем левом углу консольного окна. Должно появиться всплывающее меню, где надо выбрать пункт "Умолчания".
Появится окно настроек.

В этом окне надо выбрать нужный шрифт (например, Lucida Console). Затем, для этого шрифта надо выбрать желаемый размер (например, 14). После этого надо нажать "OK", чтобы сохранить настройки.
Затем, надо закрыть консольное окно, нажав любую клавишу.

После этого надо заново запустить программу, нажав кнопку или клавишу F9 (или выбрав меню "Build=>Build and run").
Теперь консольное окно должно иметь новый шрифт.
2.3 Пояснение программы
Теперь, после успешного запуска программы и проверки ее работы, можно подробнее разобрать составные части программы, которая была автоматически создана при создании проекта. Рассмотрим текст этой программы.
#include #include int main() < printf("Hello world!\n"); return 0; >
В 4-й строке приведено слово main , с которого начинается выполнение любой программы. Это означает основную функцию, с выполнения которой все начинается. Внутри этой функции могут быть вызовы других функций, но все начинается с выполнения содержимого main . После имени этой функции идут круглые скобки, между которыми ничего нет. Это означает, что у данной функции нет никаких аргументов. Каждая функция обязана иметь круглые скобки, даже если она не имеет аргументов.
Содержимое функции, а в данном случае содержимое всей программы, находится между фигурными скобками. Они соответствуют begin и end применительно к языку Паскаль.
Перед именем main используется слово int , которое задает тип значения, возвращаемого функцией. В данном случае это целочисленный тип (в дальнейшем разные типы данных будут рассмотрены отдельно). Функция main (то есть по сути основная программа) возвращает код выхода из программы. Обычно считается, что при нормальном выполнении программа должна возвращать значение 0. Возврат этого значения делается с помощью return 0 перед закрывающей фигурной скобкой.
Также между фигурными скобками находится вызов функции с именем printf . Эта функция используется в данном случае для вывода текста на экран. В круглых скобках для этой функции указываются ее аргументы. Здесь единственным аргументом является строка, заключенная в двойные кавычки. Именно эта строка и выводится на экран функцией printf . Но при этом на экран не выводится сочетание символов \n . Это сочетание обозначает символ перехода на новую строку, который не печатается на экране, но означает, что в данном месте должен быть выполнен переход на новую строку.
Чтобы понять смысл символа перехода на новую строку, попробуйте убрать из строки сочетание \n , запустить программу и посмотреть результат. Также попробуйте поставить сочетание \n несколько раз подряд, запустить программу и посмотреть результат. Потом верните исходный вариант программы.
После вызова функции printf поставлена точка с запятой. С помощью этого осуществляется разделение отдельных операторов между собой. В частности, выполняется разделение вызова функции printf и оператора return .
Остается понять, для чего нужны первая и вторая строка в этой программе. Не вдаваясь в подробности, можно сказать, что первая строка нужна для того, чтобы стало возможным использовать функцию printf , так как эта строка дает возможность получить информацию об этой функции. Эта строка подключает файл stdio.h , имя которого указано в скобках в виде знаков < и >. Команда #include обозначает подключение этого файла. Такое подключение позволяет использовать функции, объявленные этом файле, в частности, функцию printf . Вторая строка в этой программе вообще-то не нужна, но ее принцип действия аналогичен, только здесь подключается другой файл ( stdlib.h ).
2.4 Изменение программы
Теперь можно обратиться к редактированию файла main.c .
В поле редактирования можно набирать любой текст, как в обычном редакторе. В дальнейшем, примеры программ и фрагменты программ можно будет просто вставлять в поле редактирования, используя обычное копирование блоков текста. Рассмотрим подобное действие на следующем примере.
Содержимое файла main.c было создано автоматически. Но подобную программу можно записать чуть более кратко, а также немного изменить выводимый текст, добавив восклицательных знаков.
#include int main() < printf("Hello world. \n"); return 0; >
Теперь эту программу надо перенести в окно редактирования с помощью обычного копирования. Для этого надо выделить текст программы и скопировать в буфер обмена выделенный текст, например, нажав правую кнопку мыши и выбрав в меню "Копировать"). Затем, надо переключиться в окно редактирования Code::Blocks, выделить имеющийся там текст, и вставить текст из буфера обмена, например, выбрав меню "Edit=>Paste" или выбрав, после нажатия правой кнопки мыши, меню "Edit=>Paste"). В окне редактирования должен появиться данный вариант программы.
Сохраните новый вариант программы. Для этого достаточно нажать Ctrl-S (или выбрать меню "File=>Save file"). Приучите себя сохранять файл после каждого, пусть даже небольшого, изменения текста программы. Иначе при "зависании" может быть потерян некоторый объем работы.
Попробуйте запустить этот новый вариант программ.
Задания для самоконтроля
- Поменяйте текст "Hello world. " на какой-нибудь другой, при этом используя русский язык. Запустите программу, чтобы проверить изменения.
- Поменяйте значение 0 после return на какое-нибудь другое числовое значение, например, на 5. Запустите программу и проверьте что после "Process returned" в консольном окне выводится новое числовое значение.
- Сделайте так, чтобы при запуске программы перед выводом строки "Hello world. " происходило смещение на одну строку вниз на экране. Для этого поставьте сочетание \n в самом начале строки, используемой в качестве аргумента для функции printf . Запустите программу, чтобы убедиться в правильности выполнения задания.
- Сделайте так, чтобы при запуске программы перед выводом строки "Hello World!" происходило смещение на несколько строк вниз на экране. Для этого поставьте сочетание \n несколько раз подряд в самом начале строки, используемой в качестве аргумента функции printf (подразумевается строка, расположенная внутри скобок в кавычках). Запустите программу, чтобы убедиться в правильности выполнения задания.
- Выведите строку "Hello world. " трижды в трех последовательных строках на экране (по одному экземпляру в строке), расставив в нужных местах сочетание \n .
- Сделайте так, чтобы при запуске программы строка "Hello world. " выводилась точно по центру экрана. Для этого надо сместить строку вниз и вправо, используя \n и пробелы.
- Выведите одновременно три разных слова в трех местах на экране: в верхних углах и в центре экрана. Используйте подряд два вызова printf с разными строками в виде аргументов, используя в каждом случае особым образом \n и пробелы.
2.5 Запуск программы вне среды разработки в случае Windows
В папке проекта, путь к которой был указан при создании проекта (см. выше), должна быть папка bin/Debug . И в этой папке должен находится исполняемый файл Project01.exe , получаемый в результате сборки программы.
Этот исполняемый файл (приложение) можно запустить стандартными средствами (например, используя "Проводник"), то есть вне среды разработки Code::Blocks. Также, например, можно сделать ярлык на этот файл и разместить его на рабочий стол, чтобы потом оттуда запускать.
Но при таком запуске консольное окно с выводимой строкой появляется и сразу же исчезает, так как программа завершается сразу же, не дождавшись команды пользователя. Почему так происходит? Все дело в том, что при запуске из Code::Blocks автоматически добавляется ожидание нажатия любой клавиши, а само приложение этого не обеспечивает.
Чтобы реализовать ожидание нажатой клавиши (в случае Windows) надо изменить программу, добавив несколько строк. Тогда она примет следующий вид.
#include #include int main() < printf("Hello world. \n"); getch(); return 0; >

Попробуйте запустить эту программу из Code::Blocks. Для этого поместите указанную программу в поле редактирования вместо имеющейся, и запустите программу, нажав кнопку или клавишу F9 (или выбрав меню "Build=>Build and run").
Заметьте, что после вывода "Hello world. " теперь больше ничего не выводится, так как выполняется ожидание нажатия какой-нибудь клавиши. А вот после нажатия клавиши происходит вывод уже знакомых двух строк ("Process returned … " и "Press any key to continue."). После этих строк опять выполняется ожидание нажатия клавиши (которое обеспечивается средой Code::Blocks).
Теперь если выполнить эту программу вне Code::Blocks, запустив файл Project01.exe , то в окне выведется заданный текст и программа будет ожидать нажатия какой-нибудь клавиши для завершения.
Для такой модификации программы требуется две строки: 2-я строка, содержащая conio.h и строка, содержащая getch . Подключение conio.h необходимо, чтобы стало возможным вызывать функцию getch . Это аналогично подключение stdio.h для возможности вызова функции printf . Вызов функции getch обеспечивает ожидание нажатия клавиши.
В дальнейшем подобные изменения не будут указываться, но при необходимости вы всегда сможете их сделать, чтобы подобным образом обеспечивать ожидание нажатия какой-нибудь клавиши перед завершением программы.
2.6 Сообщения о предупреждениях и ошибках в программе
При сборке программы (при попытке ее запуска после изменений) может происходить вывод предупреждений и ошибок. Как это происходит, рассмотрим на примере. Попробуйте запустить следующую программу.
#include int main() < printf("Hello world. \n"); >
Эта программа не содержит return, но она будет запущена. Попробуйте ее запустить.

Однако в процессе компиляции будет выдано предупреждение, связанное с тем, что нет оператора return . При запуске программы это предупреждение исчезает, так как оно не влияет на запуск программы. Но его можно прочитать, если выполнить только построение файла (без запуска приложения). Для этого надо сформировать команду "Собрать" (Build), нажав Ctrl-F9, или нажав кнопку , или выбрав меню "Build=>Build".
Но если с предыдущей сборки или запуска программа не менялась, то новая сборка выполняться не будет. И в окне внизу будет выведено сообщение о том, что сборка уже самая свежая, и больше ничего не надо делать для этой команды ("Target is up to date. Nothing to be done.").


В таком случае надо собрать заново. Для этого надо сформировать команду "Собрать заново" (Rebuild), нажав Ctrl-F11, или нажав кнопку , или выбрав меню "Build=>Rebuild". После формирования этой команды появляется окно для ее подтверждения. Чтобы подтвердить эту команду надо нажать "Yes" в указанном окне.
Тогда в нижнем окне можно увидеть строку с предупреждением (синего цвета), а также сообщение о наличии одного предупреждения (1 warnings).

Вообще, предупреждение позволяет выполнить программу, но сигнализирует программисту о возможных ошибках или неточностях.
В дальнейшем оператор return для функции main можно не использовать для краткости, как это сделано в текущей программе. Но надо учитывать, что из-за этого появляется предупреждение.
Теперь попробуйте запустить следующую программу.
#include int main() < printf(Hello world. \n); >
Заметьте, что программа не будет запущена. Вместо этого в нижнем окне появятся строки красным шрифтом, которые сообщают об ошибках.

Строка в программе, где имеется ошибка, подсвечивается красным квадратом.

Надо учитывать, что одна действительная ошибка может приводить сразу к нескольким сообщениям об ошибке. В данном примере формируется 5 ошибок, поэтому выводится 5 строк красным шрифтом.
Сравнивая эту и предыдущую программу, нетрудно понять, что ошибка возникает из-за того, что при выводе текста не указаны кавычки. Соответственно выводится ошибка "'Hello' undeclared". Слово "undeclared" означает "не объявлено", то есть компилятор пытается понять, что обозначает Hello, и что при этом надо делать. Он не может найти это слово среди известных слов, поэтому выдает ошибку. Если же это слово находится в двойных кавычках, то тогда оно воспринимается как некоторая строка, внутри которой может быть что угодно. Строку можно выводить на экран. Поэтому после исправления программы (добавления кавычек, где надо) все должно быть нормально.
Исправьте программу и проверьте ее правильность выполнения.
Задания для самоконтроля
- Попробуйте убрать последнюю фигурную скобку и запустить программу. Заметьте, что ошибка отмечается в строке, содержащей printf , то есть в предыдущей строке. Восстановите правильную программу.
- Попробуйте убрать две круглые скобки после main . Заметьте, что ошибка отмечается в строке, содержащей фигурную скобку, то есть в следующей строке. Восстановите правильную программу.
- Попробуйте убрать первую круглую скобку после main . Заметьте, что ошибка отмечается в строке, содержащей main , то есть в этой же строке. Восстановите правильную программу.
Учитывая задания для самоконтроля, нетрудно заметить, что ошибка может содержаться рядом со строкой, отмеченной красным квадратом. Поэтому при возникновении ошибки надо анализировать также и соседние строки.
3 Базовые сведения
3.1 Целые числа
Для работы с данными, в частности, с целыми числами понадобятся переменные, которые служат для хранения таких чисел. Для начала переменную надо объявить, чтобы начать с ней работать.
Объявление переменной выполняется следующим образом.
тип_переменной имя_переменной;
Например, целочисленная переменная a объявляется следующим образом.
int a;
В данном случае переменная a имеет тип int , что обозначает целочисленный тип.
Объявление переменной задает некоторый блок памяти для хранения данных указанного типа. Естественно, что можно выделять несколько подобных блоков. Чтобы отличать их друг от друга эти блоки именуются. Например, объявление int a выделяет блок с именем a , объявление int b выделяет блок с именем b и т. д. При этом можно одновременно объявить несколько переменных, то есть выделить несколько однотипных блоков с разными именами. Для этого имена этих блоков перечисляются через запятую после обозначения типа.
int x, y, z;
В данном объявлении выделяется три разных блока одного типа с разными именами.
Чтобы в выделенный блок данных записать значение, надо соответствующей переменной присвоить это значение, например, выражение
a = 10;
выполняет присвоение переменной а значения 10. Также можно одной переменной присвоить значение другой переменной, например, выражение
a = b;
выполняет присвоение переменной a значения переменной b . Можно присвоить одно и то же значение сразу нескольким переменных. Для этого, например, можно использовать следующее выражение.
x = y = z = 100;
Помните, что переменной можно присвоить значение, только если эта переменная была объявлена (в частности, для нее был указан ее тип).
Значение переменной можно вывести на экран с помощью функции printf . В качестве примера проверьте выполнение следующей программы.
#include int main() < int a; /* объявление переменной a */ a = 10; printf("Значение переменной a = %d\n", a); >
Обратите внимание на то, что в программе имеется комментарий "объявление переменной a". Комментарий – это фрагмент, который нужен для описания той или иной части программы. Комментарий не влияет на итоговую программу, это просто добавление в текст, которое в дальнейшем не используется при выполнении программы. Комментарий должен начинаться с комбинации символов /* и заканчиваться комбинацией символов */ . При этом комментарий может располагаться на нескольких строках, для этого комбинация /* будет расположена в начале первой строки комментария, а комбинация */ будет расположена в конце последней строки комментария.
В самом начале функции main выполняется объявление переменной а . Затем этой переменной присваивается значение 10. В следующей строке с помощью функции printf выполняется вывод значения переменной на экран. Для этого добавляется дополнительный аргумент функции printf через запятую после строки в кавычках. Этим дополнительным аргументом является сама переменная a , значение которой должно быть выведено на экран. Чтобы сообщить функции printf , куда вывести значение переменной, в выводимую строку добавляется комбинация из двух символов, а именно %d . Сами эти символы выводиться на экран не будут, но вместо них будет выведено значение переменной идущей через запятую после строки. Запустите программу и проверьте ее работу.
При наборе программы обратите внимание, что маленькие и большие буквы – это разные буквы с точки зрения компилятора. Поэтому, например, набор Main вместо main приведет к ошибке.
Задания для самоконтроля
- Поменяйте значение переменной a на какое-нибудь другое значение и проверьте правильность выполнения программы.
- Попробуйте добавлять комментарии в различные части программы. Убедитесь, что они не влияют на выполнение программы. Проверьте использование комментариев, занимающих несколько строк подряд.
- Проверьте, что произойдет при изменении регистра той или иной буквы, то есть, например, при изменении маленькой буквы на большую и наоборот.
Для объявления переменной а и ее инициализации получается подряд идущие две строки (объявление и присвоение). Но можно совместить объявление переменной и ее инициализацию. Вместо указанных двух строк можно записать только одну строку следующего вида.
int a = 10;
Проверьте правильность работы программы после такого изменения.
С помощью функции printf также можно выводить значения сразу нескольких переменных. Для проверки этой возможности сделайте объявление переменной b и присвоение некоторого значения этой переменной перед вызовом функции printf . Важно отметить, что объявление переменной может выполняться в любом месте внутри фигурных скобок функции, в частности, функции main . После этого преобразуйте строку с функцией printf следующим образом.
printf("a = %d, b = %d \n", a, b);
Проверьте правильность выполнения программы.
Таким образом, для вывода значений сразу нескольких переменных надо расставить соответствующим образом символы форматированного вывода %d в строке вывода, а также перечислить переменные через запятую сразу после строки вывода в порядке вывода. Тогда вместо каждой комбинации %d будет подставляться значение очередной переменной из списка переменных, перечисленных через запятую.
При этом в качестве аргумента функции printf также можно указывать выражение. Например, для возведения переменной в квадрат и в куб можно использовать знак * , обозначающий умножение. Добавьте после имеющегося вызова функции printf следующий фрагмент.
printf("a = %d\n(а в квадрате) = %d\n(a в кубе) = %d\n", a, a * a, a * a * a);
Проверьте правильность выполнения программы.
Заметьте, если вызов функции – это слишком длинная строка, то ее удобно делить на несколько строк по запятым. Например, как это было сделано в данном тексте, но этот же фрагмент можно записать и в одну строку по желанию программиста.
3.2 Арифметические выражения
Теперь, чтобы возвести в квадрат или в куб некоторое целое число достаточно исправить начальное присвоение переменной а , и заново запустить программу. Поэкспериментируйте с этим. Кроме возведения в квадрат и в куб можно использовать различные выражения, составляемые на основе арифметических операций: + , - , * , / .
Задания для самоконтроля
- Реализуйте вычисление какой-нибудь формулы, использующей все 4 арифметические операции. Значение переменной задавайте в программе. Проверьте правильность вычисления этой формулы.
- Сделайте вычисление формулы от двух переменных. Значения переменных задавайте в программе.
В языке Си также имеется возможность более лаконичной записи некоторых часто используемых конструкций. Так, для увеличения переменной на заданное значение используется операция += . Получается, что выражение
a += 10;
a = a + 10;
при этом, аналогичным образом, вместо знака + могут быть также знаки - , * , / , а также некоторые другие знаки операций.
Следующий фрагмент программы иллюстрирует примеры использования указанных возможностей, при этом в комментариях указываются значения, которые принимает переменная в результате вычисления арифметического выражения.
int i = 10; i = (i * 2 + 1) / 3 - 5; /* i = 2 */ i += 5; /* i = 7 */ int j = 3; i *= j; /* i = 21 */ i /= 7; /* i = 3 */
Задание для самоконтроля
- Реализуйте вычисление какой-нибудь формулы, использующей указанные возможности (более лаконичной формы записи некоторых арифметических выражений).
Кроме того, выражение
обозначает увеличение переменной a на 1, что эквивалентно выражению
a = a + 1;
Аналогичным образом, выражение
здесь означает уменьшение на 1.
Важно отметить, что также существуют выражения вида
Они также обозначают увеличение на 1 и уменьшение на 1.
Однако, существует разница между префиксной ( ++a ) и постфиксной формами ( a++ ) в составе более сложных выражений.
В случае префиксной формы ( ++a ) сначала происходит увеличение (уменьшение) на 1, а затем вычисление остального выражения.
В случае постфиксной формы ( a++ ) сначала вычисляется выражение, а затем выполняется увеличение (уменьшение) на 1.
Это различие иллюстрирует следующий пример.
Рассмотрим этот же фрагмент, где используется ++y (префиксная форма).
int x = 10; int y = 2; x = x * (++y); printf("x = %d y = %d\n", x, y);
В ходе выполнения этого фрагмента на экране будет выведена следующая строка.
x = 30 y = 3
Здесь сначала y за счет ++y получит значение 3, а уже после этого произойдет умножение 10 на 3.
Рассмотрим этот же фрагмент, где используется y++ (постфиксная форма).
int x = 10; int y = 2; x = x * (y++); printf("x = %d y = %d\n", x, y);
В ходе выполнения этого фрагмента на экране будет выведена следующая строка.
x = 20 y = 3
Здесь сначала произойдет умножение 10 на значение y, равное 2, а уже после этого произойдет выполнение y++ .
Надо заметить, что в этих фрагментах совсем не обязательно ставить круглые скобки вокруг ++y и y++ .
Задания для самоконтроля
- Проверьте выполнение указанных фрагментов программ. Надо учитывать, что это всего лишь фрагменты программ. Их надо добавлять внутрь фигурных скобок функции main .
- Попробуйте в этих фрагментах убрать круглые скобки вокруг ++y и y++ . Убедитесь, что результат от этого не изменится.
3.3 Типы целых чисел
Пока мы рассматривали только тип int для целых чисел. Какое предельные значения могут быть заданы для переменной типа int ?
Гарантированно можно задавать значения в диапазоне от -32768 до 32767, так как для переменной типа int отводится не меньше 16 бит.
Но в настоящее время вы часто будете встречать реализации компилятора, где для переменной типа int отводится 32 бита, то есть эта переменная может принимать значения в диапазоне от -2147483648 до 2147483647.
Однако, можно быть точно уверенным, что диапазон допустимых значений для переменной x не будет меньше, чем диапазон от -32768 до 32767.
При использовании предложенной версии Code::Blocks и поставляемого с этой средой компилятора gcc (или ранее установленного аналогичного компилятора), скорее всего, вы окажитесь в ситуации, когда переменная типа int может принимать значения из диапазона -2147483648 до 2147483647.
Проверим это с помощью следующего примера.
#include int main() < int x1 = -2147483648; int x2 = 2147483647; printf("x1 = %d x2 = %d\n", x1, x2); >
При выполнении данной программы, скорее всего, будет выведена следующая строка.
x1 = -2147483648 x2 = 2147483647
Если это так, то это показывает, что переменная типа int может принимать такие значения.
Теперь перед строкой printf можно сделать увеличение переменной x2 на 1
#include int main() < int x1 = -2147483648; int x2 = 2147483647; ++x2; printf("x1 = %d x2 = %d\n", x1, x2); >
При выполнении данной программы, скорее всего, будет выведена следующая строка.
x1 = -2147483648 x2 = -2147483648
Заметьте, что значение переменной x2 стало отрицательным предельным значением. Можно сказать, что при попытке добавить 1 к максимальному положительному значению (значению 2147483647) произошел выход за пределы диапазона и значению "по кругу" перешло к предельному отрицательному значению (значению -2147483648). Произошло так называемое переполнение.
Если увеличивать x2 не на 1, а на 2, то переменная x2 примет значение -2147483647 (что на 1 отличается от предельного отрицательного значения). Проверьте это.
Если увеличивать x2 не на 1, а на 3, то переменная x2 примет значение -2147483646 (что на 2 отличается от предельного отрицательного значения). Проверьте это.
Таким образом, можно понять принцип поведения целочисленных переменных в случае их переполнения.
Задания для самоконтроля
- Аналогичным образом проверьте переполнение переменной x1 в сторону предельного отрицательного значения, то есть при вычитании некоторого числа из этой переменной.
- Переполнение возникает и при простой попытке присвоить переменой значения, которое выходить за пределы разрешенного диапазона. Проверьте это.
Кроме типа int для объявления переменных существует другие целочисленные типы.
Например, тип long позволяет гарантированно обеспечить -2147483648 до 2147483647 (тип int не дает такой гарантии для всех компиляторов).
Также в современных компиляторах языка C появился тип long long (пишется в два слова), который отводит 64 бита для переменной. И это соответствует диапазону чисел от -9223372036854775808 до 9223372036854775807.
Проверим этот тип на примере следующей программы.
#include int main() < long long x1 = -9223372036854775808; long long x2 = 9223372036854775807; printf("x1 = %lld x2 = %lld\n", x1, x2); >
При выполнении данной программы должна быть выведена строка.
x1 = -9223372036854775808 x2 = 9223372036854775807
Заметьте, что в данном случае при вызове функции printf используется комбинация символов %lld , а не %d . Это необходимо, чтобы функция printf правильно отображала большие числа, соответствующие типу long long .
Задания для самоконтроля
- Аналогичным образом проверьте переполнение переменных типа long long в данном примере (как это было с переменными типа int ).
- Попробуйте в данном примере в функции printf использовать %d вместо %lld .
Кроме того, можно формировать новые целочисленные типы, если перед его названием добавлять ключевое слово unsigned , что сдвигает диапазон возможных значений в положительную область, то есть делает тип, не имеющим знака. Следующий пример программы поясняет это.
#include int main() < unsigned int x1 = 0; unsigned int x2 = 4294967295; printf("x1 = %u x2 = %u\n", x1, x2); >
При выполнении данной программы должна быть выведена строка.
x1 = 0 x2 = 4294967295
Заметьте, что в данном случае при вызове функции printf используется комбинация символов %u , а не %d . Это необходимо, чтобы функция printf правильно отображала числа, соответствующие типу без знака.
Задания для самоконтроля
- Аналогичным образом проверьте переполнение переменных типа unsigned int в данном примере (как это было с переменными типа int ).
- Попробуйте в данном примере в функции printf использовать %d вместо %u .
- На основе данного примера попробуйте вывести на экран максимальное значение, которое может быть записано в переменную типа unsigned long long (а именно число 18446744073709551615). Для правильного отображения с помощью функции printf используется комбинацию символов %llu (вместо %u).
3.4 Вещественные числа
Для задания вещественных чисел можно использовать тип float или тип double . При этом переменная типа float занимает 4 байта, а переменная типа double занимает 8 байт. Поэтому, в целом, тип double обеспечивает более широкий диапазон возможных чисел и большее количество десятичных разрядов после десятичной точки, но недостатком его является двойной расход памяти по сравнению с типом float .
Также есть еще тип long double , и переменная данного типа может занимать от 8 до 16 байт в зависимости от реализации компилятора. Поэтому часто тип long double обеспечивает еще большую точность в обмен на больший расход памяти.
Проверим выполнение следующей программы.
#include int main() < double x = 10.5; printf("x = %f\n", x); >
На экране выведется:
x = 10.500000
Заметьте, что вместо %d используется %f , что объясняется использованием вещественного типа вместо целого. Проверьте, что будет, если поставить %d вместо %f .
Как убрать лишние нули при выводе числа? Для этого можно указать количество разрядов после десятичной точки, например, следующим образом.
printf("x = %.1f \n",x);
При этом число после точки указывает на количество разрядов после десятичной точки. Поэкспериментируйте с этим.
Кроме того, можно задать количество знаков, используемых для вывода числа, например, можно установить это количество, равным 10, следующим образом.
printf("x = %10.1f \n",x);
Проверьте, что при этом изменится.
Кроме того, вместо буквы f , идущей в сочетании с % , можно использовать букву е для вывода числа в экспоненциальной форме, а также букву g для автоматического подбора формата вывода в зависимости от величины числа. Кроме того, также можно использовать буквы Е и G .
Задания для самоконтроля
- Попробуйте различные варианты вывода вещественного числа и посмотрите, что при этом получается (в том числе, используйте буквы e и g вместо f в сочетании с % ).
- Определите самостоятельно, к чему приводит использование букв E и G по сравнению с буквами e и g .
- Реализуйте возведение вещественного числа в квадрат и в куб, обеспечив вывод на экран полученных значений. Выберите подходящий формат вывода вещественного числа.
Org version 7.8.11 with Emacs version 24