Макросы (C/C++) | Microsoft Learn
Twitter LinkedIn Facebook Адрес электронной почты
- Статья
Препроцессор расширяет макросы во всех строках, кроме
Директива #define
обычно используется для связывания понятных идентификаторов с константами, ключевыми словами и часто используемыми операторами или выражениями. Идентификаторы, представляющие константы, иногда называются символьными константами или константами манифеста. Идентификаторы, представляющие инструкции или выражения, называются макросами. В этой документации препроцессора используется только термин «макрос».
Если имя макроса распознается в исходном тексте программы или в аргументах некоторых других команд препроцессора, оно рассматривается как вызов этого макроса. Имя макроса заменяется копией тела макроса. Если макрос принимает аргументы, фактические аргументы после имени макроса заменяются на формальные параметры в теле макроса. Процесс замены вызова макроса обработанным копированием текста называется расширением вызова макроса.
На практике это означает, что существует два типа макросов. Макросы, подобные объекту, не принимают аргументы. Макросы, подобные функциям, можно определить для приема аргументов, чтобы они выглядели и действовали как вызовы функций. Поскольку макросы не создают фактические вызовы функций, иногда можно ускорить выполнение программ, заменив вызовы функций макросами. (В C++встроенные функции часто являются предпочтительным методом.) Однако макросы могут создавать проблемы, если вы не определяете и не используете их с осторожностью. Возможно, потребуется использовать круглые скобки в определениях макроса с аргументами, чтобы сохранить правильный приоритет в выражении. Кроме того, макросы могут неправильно обработать выражения с побочными эффектами.
getrandom
примере директивы #define.После определения макроса его нельзя переопределить в другое значение, не удаляя исходное определение. Однако макрос можно переопределить точно таким же определением. Таким образом, одно и то же определение может отображаться несколько раз в программе.
Директива #undef
удаляет определение макроса. После удаления определения можно переопределить макрос на другое значение. Директива #define и директива #undef обсуждают #define
и #undef
директивы соответственно.
Дополнительные сведения см. в следующих разделах:
Макросы и C++
Макрос со списками аргументов переменных
Предустановленные макросы
Справочник по препроцессору в C/C++
умная кросс-платформенная IDE JetBrains для C и C++
Мощный инструмент
для мощного языка
Хотели бы программировать со скоростью мысли, оставив всю грязную работу IDE? Возможно ли это для такого непростого языка, как C++, со всеми его современными стандартами и библиотеками со множеством шаблонов? Возможно! И вы можете убедиться в этом сами.
Умный редактор C и C++
Помощь при написании кода
Редактор, хорошо понимающий C и C++, позволит вам намного эффективнее работать с кодом. Используйте Smart Completion, фильтруя варианты автодополнения по типу. Навигация breadcrumbs поможет отслеживать текущее местонахождение в иерархии областей имен. Для любого вызова функции доступна подсказка с информацией о параметрах. Вы можете искать использования символов по контексту либо по имени символа переходить к его определению. CLion проследит, чтобы ваш код соблюдал стиль, в том числе правила форматирования, именования и пр.
Генерация кода
Моментально генерируйте любой шаблонный код. Переопределяйте и реализуйте функции, пользуясь простыми сочетаниями клавиш. Добавляйте конструкторы и деструкторы, геттеры и сеттеры, операторы равенства, сравнения и потокового вывода. Оборачивайте фрагменты кода в любые выражения, генерируйте объявления на основе предыдущих использований. Создавайте свои шаблоны Live Templates, чтобы переиспользовать тот или иной фрагмент кода — это позволит экономить время и соблюдать единство стиля.
Безопасный рефакторинг
Вы можете переименовывать символы, встраивать функции, переменные и макросы, перемещать члены класса по иерархии, менять сигнатуру функций, извлекать переменные, параметры, функции и объявления typedef. Не бойтесь применять рефакторинги: CLion применит изменения везде, где это нужно.
Быстрый просмотр документации
Перемещая курсор по коду, вы сможете узнать о нем буквально все. Проверяйте сигнатуру функций, просматривайте комментарии и документацию Doxygen, уточняйте типы, выводимые для символов неявного типа. Вы даже можете просматривать отформатированные вставки макросов.
Анализ кода на ходу
Создавайте элегантный и безупречный код. CLion поможет выявить любые проблемы прямо по ходу написания кода…
… и исправить их одним нажатием кнопки — IDE сама применит все необходимые изменения.
CLion запускает анализ кода, Data Flow Analysis, другие Clangd-проверки и Clang-Tidy, которые помогают выявлять неиспользуемый или недостижимый код, висячие указатели, необходимость выполнить приведение типов, перегрузку функций и другие правки.
Встроенный отладчик
Удобный интерфейс отладчика CLion с поддержкой GDB и LLDB поможет легко находить и решать проблемы в коде.
Подключайтесь к локальным процессам или выполняйте отладку удаленно. Если вы занимаетесь программированием микроконтроллеров, в проверке периферии вам помогут конфигурации OpenOCD и Embedded GDB Server.
А для полного погружения используйте возможности просмотра периферии микроконтроллеров и просмотра дизассемблированного кода и памяти.
Точки останова
Исследуйте код с помощью разных видов точек останова — для строк, символов, при возникновении исключений и выполнении определенных условий. При срабатывании точки останова можно выполнить логирование и удалить данную точку останова либо временно отключить ее (до срабатывания другой точки останова). Поведение настраивается в специальном диалоге.
Быстрый просмотр результата
При отладке используйте переменные Watch и вкладки Variables. Также вы можете вычислять функции и другие выражения во время остановки исполнения.
Просматривайте значения на месте
Во время отладки значения переменных будут отображены прямо в редакторе — вам не обязательно переключаться во вкладку Variables окна Debug.
Интегрированная среда разработки на C/C++
Модели проектов
Чтобы обеспечить помощь при написании кода, рефакторинги, проверки единства стиля кода и другие умные возможности редактора, CLion использует информацию из проектной модели. Поддерживаются форматы CMake, Makefile, Gradle и compilation database.
Удобное управление с клавиатуры
Практически для всех функций, действий и команд предусмотрены удобные сочетания клавиш — используя их, вы сможете лучше сосредоточиться на коде и работать продуктивнее.
Любители Vim могут установить плагин эмуляции Vim.
Удаленная и совместная работа
Отредактировав код в IDE, вы можете выполнять сборку, запуск и отладку приложения и тестов локально, удаленно либо на микроконтроллере.
Работайте над проектом вместе с коллегами прямо из своих IDE благодаря возможностям для совместной разработки.
Все, что нужно, в одном инструменте
В CLion есть все, что необходимо разработчику: IDE интегрирована с популярными системами контроля версий (SVN, Git, GitHub, Mercurial и Perforce), фреймворками для юнит-тестирования Google Test, Boost.Test и Catch, поддерживает Markdown, систему документирования Doxygen и инструменты для работы с базами данных.
Подробно о том, что умеет CLion
Что нового в CLion 2023.1
Обновления отладчика
Вас ждут новые возможности в отладчике: дизассемблирование по требованию, приостановка или возобновление отдельных потоков при отладке многопоточных приложений, а также переработанный диалог Attach to Process….
Интеграция с vcpkg
Менеджер пакетов vcpkg становится все популярнее среди C++-разработчиков. Теперь он интегрирован с CLion, а значит вы можете устанавливать и обновлять vcpkg и его пакеты, а также просматривать установленные и доступные пакеты в специальном окне.
C++
В CLion 2023.1 добавлено действие, которое поможет вам создать в проекте новый C++ Module Interface Unit. Кроме того, вас ждут более гибкие рефакторинги и улучшенный диалог параметров проверок Clang-Tidy.
Что нового в CLion
Что говорят наши клиенты
Jason Turner
C++ Weekly, CppCast, преподаватель, консультант«CLion был для меня незаменим, когда я занимался рефакторингом больших кодовых баз. Я могу экономить время благодаря специальным инструментам для рефакторинга и подсказкам IDE. С каждый релизом CLion становится все лучше и быстрее!»
Prof. Dr. Rodriguez-Losada
Conan, JFrog«CLion — это фантастика! Наконец-то есть качественная кросс-платформенная IDE для C++ с поддержкой CMake, которую мы так ждали.»
Erkki Salonen
разработчик«Мощные рефакторинги CLion и кодовая модель, которая понимает зависимости между элементами, изменили мой подход к разработке. Теперь можно обнаружить кучу ошибок еще до запуска приложения.»
Matthew Davey
dotBunny«Оба эти инструмента (CLion и Rider) помогают нашей команде каждый день, позволяя разработчикам решать задачи быстро и эффективно, и при этом легко интегрируются с другими элементами нашего процесса.»
Компании по всему миру доверяют инструментам JetBrains. Присоединяйтесь!
определений макросов (#define) — MATLAB и Simulink
Основное содержимое
Открытый сценарий
C Construct
#define myParam 9.8;
Экспорт определения сгенерированного макроса
1. Откройте пример модели ex_param_macro
.
2. В модели выберите блок Gain. В инспекторе свойств задайте для параметра Gain значение myParam
.
3. Рядом со значением параметра нажмите кнопку действия (кнопка с тремя вертикальными точками) и выберите Создать .
4. В диалоговом окне Create New Data установите Simulink.Parameter(9.8)
. Нажмите Создать . Объект Simulink.Parameter
, myParam
, появляется в базовой рабочей области. Блок Gain использует объект для установки значения параметра Gain, в данном случае 9.8
.
5. На вкладке Code Generation нажмите кнопку Configure in Coder App . В редакторе сопоставлений кода установите Класс хранения от до Определить
. Нажмите ОК .
6. Чтобы построить модель и сгенерировать код, нажмите Ctrl+B .
Сгенерированный файл заголовка ex_param_macro.h
определяет myParam
как макрос.
/* Определение пользовательского класса хранения: Define */ #define myParam 9.8 /* На который ссылается: '/Gain' */
Повторное использование макроса из рукописного кода
1.
В редакторе сопоставлений кода на Вкладка Параметры , нажмите кнопку Обновить сопоставления кода . 2. Изменить Storage Class из myParam
с Define
на ImportedDefine
.
3. В инспекторе свойств в разделе Code установите для Заголовочный файл значение external_params.h
. Сгенерированный код импортирует определение макроса из пользовательского файла заголовка с именем external_params.h
.
4. В текущей папке создайте заголовочный файл C external_params.h
, который содержит оператор #define
.
#ifndef _ВНЕШНИЕ_ПАРАМЫ #define _ВНЕШНИЕ_ПАРАМЫ #define myParam 9.8 #endif /* конец файла */
5. Чтобы построить модель и сгенерировать код, нажмите Ctrl+B
Сгенерированный файл заголовка ex_param_macro.h
не определяет макрос. Вместо этого файл использует #include
для включения пользовательского файла заголовка external_params.h
.
/* Включает объекты с пользовательскими классами хранения */ #include "external_params.h"
Исходный файл ex_param_macro.c
содержит защиту для проверки существования определения для myParam
.
#include "rtwtypes.h" #include "external_params.h" /* * Убедитесь, что определены импортированные макросы с классом хранения «ImportedDefine». */ #ifndef мой параметр #error Значение параметра "myParam" не определено #endif
- Обмен данными между внешним кодом C/C++ и моделью Simulink или сгенерированным кодом
- Организуйте данные параметров в структуру с помощью класса хранения Struct
- Выберите класс хранения для управления представлением данных в сгенерированном коде
У вас есть модифицированная версия этого примера. Хотите открыть этот пример со своими правками?
Вы щелкнули ссылку, соответствующую этой команде MATLAB:
Запустите команду, введя ее в командном окне MATLAB. Веб-браузеры не поддерживают команды MATLAB.
Выберите веб-сайт, чтобы получить переведенный контент, где он доступен, и ознакомиться с местными событиями и предложениями. В зависимости от вашего местоположения мы рекомендуем вам выбрать: .
Вы также можете выбрать веб-сайт из следующего списка:
Европа
Обратитесь в местный офис
- Пробная версия ПО
- Пробная версия программного обеспечения
- Обновления продукта
- Обновления продуктов
Оператор создания строк и оператор вставки токенов
Перейти к основному содержанию
Дармаван СалихунДармаван Салихун
Дармаван Салихун
Разработка программного обеспечения и реверс-инжиниринг (C, C++, Python, немного инструментов для ассемблера и реверс-инжиниринга)
Опубликовано 17 февраля 2016 г.
+ Подписаться
Современный язык C развился до такой степени, что мы можем продуктивно писать на нем код. Многие до сих пор считают, что написание кода на C утомительно по сравнению с написанием кода на других языках более высокого уровня. Думаю, это субъективное мнение. Пожалуй, только функциональные языки имеют более высокую производительность по сравнению с Си для большей части несистемного программирования.
Две «функции производительности» в C, которые я считаю незаменимыми в данный момент, — это оператор преобразования строк (#) и оператор вставки токенов (также известный как оператор конкатенации) (##). Оба этих оператора можно использовать только в макросах C, вы не можете использовать их вне макросов C. Тем не менее, оба являются очень мощными инструментами для создания шаблонов функций в C. Да, вы не ошиблись. Шаблоны функций предназначены не только для программистов на C++. У программистов на C также есть своего рода шаблон функций с помощью макросов C, несмотря на то, что он немного «зачаточный» по сравнению с C++.
Большинство руководств по созданию строк и вставке токенов не предоставляют полезных фрагментов кода в отношении реальной силы этих операторов. Этот пост призван восполнить этот пробел. Без лишних слов давайте перейдем к примеру кода. Вы можете клонировать полный пример кода с https://github.com/pinczakko/sample_token_pasting.
Оператор преобразования строки (#) в основном создает строку C из параметра макроса C. Например, если вы передадите ответ в качестве параметра макросу C, препроцессор C выдаст «ответ» (строка C, включая двойные кавычки) в качестве вывода, если содержимое макроса применяет оператор строкового преобразования к этому конкретный параметр макроса.
В большинстве компиляторов вы можете получить вывод препроцессора с помощью определенных переключателей компилятора. В GCC для этого можно использовать ключ -save-temps. Выходные данные препроцессора GCC представляют собой файл *.i с тем же именем, что и исходный файл. В моего примера кода, Makefile использует этот переключатель, чтобы указать GCC поместить вывод препроцессора в каталог исходного кода. Кроме того, я использовал отступ утилиты (отступ -linux sample_token_pasting.i) для украсить вывод препроцессора, чтобы сделать его более читабельным.
Давайте перейдем к другому оператору, оператору вставки токенов. Этот оператор в основном «вставляет и объединяет» параметр макроса, чтобы создать «целевой» токен C как из параметра макроса, так и из «фрагмента» токена C в содержимом макроса. Если вы еще не совсем поняли, что такое токен языка C, прочитайте http://www.help2engg.com/c_tokens и https://msdn.microsoft.com/en-us/library/c6sb2c6b.aspx. В примере кода используется оператор вставки токенов для создания «настраиваемых» имен функций C и констант.
Очень жаль, что Linkedin до сих пор не поддерживает правильное отображение исходного кода. Перейдите к моему исходному сообщению: Макрос C 101: оператор создания строк и оператор вставки токенов для полного и краткого объяснения операторов и примера кода.
Надеемся, что объяснение в этом посте проясняет возможности оператора C для создания строк и вставки токенов.
C++ — это «не» просто объектно-ориентированный язык
9 октября 2016 г.
Загрузка UEFI из Интернета
23 июля 2016 г.
Использование библиотеки Boost C++ из C
19 января 2016 г.
Малоизвестные особенности языка C
18 января 2016 г.