Макросы си: Макросы в Си: как, когда и зачем?

Предопределенные макросы | Программирование на C и C++

Главная » Язык С » Препроцессор и комментарии

Стандарт ANSI С имеет 5 предопределенных макросов:

__LINE__
__FILE__
__DATE__
__TIME__
__STDC__

Borland С++ также определяет дополнительные макросы:

__ВСОРТ__
__BCPLUSPLUS__
__BORLANDC__
__CDECL__
__CHAR_UNSIGNED
__CONSOLE__
__CPPUNWIND
__cplusplus
__DLL__
_M_IX86__
__MSDOS__
__MT__
__OVERLAY__
__PASCAL__
__TCPLUSPLUS __
__TEMPLATES__
__TLS__
__TURBOC__
__WCHAR_T
__WCHAR_T_DEFINED
__Windows
__WIN32__

Макрос __DATE__ содержит строку в виде месяц/день/год, соответствующую дате перевода ис­ходного кода в объектный.

Время, когда был откомпилирован исходный код, содержится в строке __TIME__ в формате
часы: минуты: секунды.

Если определен макрос __STDC__ то, значит, программа была откомпилирована с использо­ванием стандарта ANSI С со включенной проверкой на совместимость.

В противном случае
__STDC__ не определен.

__ВСОРТ__ определен, если используется оптимизация.

При использовании Borland С++ если компилировать программу как С++-программу, то опре­деляется макрос __BCPLUSPLUS__. Компиляция С++-программы также приводит к определе­нию __TCPLUSPLUS__. Оба макроса содержат шестнадцатиричные значения, увеличивающиеся с каждой новой версией компилятора.

__BORLANDC__ содержит текущую версию компилятора (в шестнадцатиричном виде).

Макрос __CDECL__ определен, если используется стандартное соглашение С о вызове функ­ций, т.е. паскалевский вызов не используется. В противном случае макрос не определен (если определен, то он принимает значение 1).

Если определен __CHAR_UNSIGNED, то стандартным символьным типом становится unsigned.

Если __CONSOLE__ определен для 32-битного компилятора, то программа является консоль­ным приложением.

Если __CPPUNWIND определен, то разрешено разворачивание стека.

Если программа откомпилирована как С++-программа, то __cplusplus установлен в 1.

Для Borland С++ __DLL__ установлен в 1 при создании DLL-файла.

Макрос __М_IХ86 определен всегда.

Макрос __MSDOS__ установлен в 1 при использовании MS-DOS версии Borland C/C++.

Макрос __МТ__ установлен в 1, если многопоточная библиотека используется с 32-битным
компилятором.

Когда программа компилируется с использованием оверлеев, то __OVERLAY__ установлен в 1.

Макрос __PASCAL__ установлен в 1 только в том случае, если при компиляции программы
используется паскалевское соглашение о вызовах функций.

Для Borland С++ __TEMPLATES__ установлен в 1 для всех версий компиляторов, поддержи­вающих шаблоны. Данный макрос применим только при компиляции С++-программ.

При компиляции с использованием 32-компилятора __TLS__ содержит ненулевое значение.

__TURBOC__ содержит шестнадцатиричное значение, увеличивающееся с каждой новой вер­сией языка.

Для С++-программ _WCHAR_T и _WCHAR_T_DEFINED установлены в 1 для указания того, что тип wchar_t является встроенным типом данных. Они не определены для С-программ.
Для Borland С++ _Windows определен, если программа компилируется для использования под Windows.

При использовании 32-битного компилятора __WIN32__ установлен в 1.

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

‹ Операторы препроцессора # и ## Вверх Комментарии ›

Макросы при работе с панелями ОВЕН СП3хх

Для реализации пользовательских алгоритмов на панели ОВЕН СП3xx используются макросы. Макросы представляют собой небольшие программы, написанные на языке ANSI C (C89). Каждый проект по умолчанию содержит глобальный макрос (рис. 1), который предназначен для объявления глобальных переменных и функций, доступных в пользовательских макросах.

Для создания пользовательского макроса в дереве проекта выбирается узел Макросы, в контекстном меню – команда Добавить макрос. Другая команда этого меню – Компиляция – используется для проверки корректности синтаксиса всех макросов проекта.

 

Простейший макрос

На рис. 2 приведен пример простейшего макроса, который суммирует значения регистров PSW300-303 и записывает результат в регистр PSW400. В левой части редактора макросов отображается список системных функций. Их полное описание приведено в Руководстве пользователя и справке программы Конфигуратор СП300.

Рис.1.

Вызов макросов

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

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

Рис.2.

 

Работа с внутренней памятью

Панели СП3xx имеют три независимые области памяти – PSB (биты), PSW (оперативные регистры), PFW (энергонезависимые регистры).

Методика работы с каждой областью памяти в макросах различается.

Рис.3.
  • Для работы с PSB используются функции: GetPSBStatus – чтение бита; SetPSB – установка бита в TRUE; ResetPSB – установка бита в FALSE. В качестве примера представлен макрос, который записывает значение бита PSB300 в PSB400 (рис. 4).
  • Работа с PSW производится с помощью оператора присваивания «=»: PSW[400]=PSW[300];
  • Работа с PFW осуществляется с помощью функций Read/Reads и Write/ Writes. На рис. 5 приведен код макроса, который считывает значение PFW300 в локальную переменную wVar и записывает ее значение в PFW400. C помощью функций Reads/Writes можно считывать и записывать массивы данных.

 

 

Пример использования макросов – работа с COM-портом

Рис. 4.

Для записи в регистр битовой маски выходов модулей ОВЕН MУ110 и МК110 нужно применять функцию Modbus 0x10 (Write Multiple Registers). Однако при использовании графических элементов панели запись одного регистра всегда производится функцией 0x06 (Write Single Register), поэтому при работе с модулями МУ/МК обмен реализуется через макросы.

В качестве примера рассмотрим работу с модулем ОВЕН МК110. Объявим в глобальном макросе функцию MK_MASK_WRITE. Ее аргументами являются адрес модуля, адрес записываемого регистра, значение и номер бита, в который записывается статус обмена.

Код функции показан на рис. 6. Функция MK_MASK_WRITE выполняет три действия:

Рис.5
  • формирует запрос к модулю по протоколу Modbus;
  • отправляет этот запрос в PLC-порт, считывает ответ и освобождает порт;
  • выставляет флаг ошибки в заданный бит при некорректном ответе.

Функцию MK_MASK_WRITE следует вызывать в пользовательском макросе (рис. 7). В результате выполнения данного макроса в модуль МК110 с адресом 70 в регистр 50 (регистр битовой маски выходов) будет записано значение регистра панели PSW300. В случае ошибки биту PSB400 присваивается значение TRUE.

Рис.6

Обращаем внимание, что при работе с портом нет необходимости задавать его параметры, так как они настраиваются в Конфигураторе СП300. Использование порта в макросе не влияет на опрос через графические элементы.

 

Заключение

Макросы представляют собой удобный инструмент для решения нестандартных задач. Использование макросов значительно расширяет возможности панелей СП3xx. Подробное описание макросов приведено в Руководстве пользователя и справке программы Конфигуратор СП300. Пример работы с модулями МУ/МК доступен для скачивания на сайте owen.ru.

 

Рис.7

Как работает препроцессор в C?

Улучшить статью

Сохранить статью

  • Уровень сложности: Easy
  • Последнее обновление: 08 фев, 2018

  • Читать
  • Обсудить
  • Улучшить статью

    Сохранить статью

    Компиляция программы на языке C — за кулисами

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

    Предварительная обработка — это первый шаг системы языковой обработки. Система обработки языка переводит язык высокого уровня в язык машинного уровня или абсолютный машинный код (т. е. в форму, понятную машине).

    1. Удаление комментариев : Удаляет все комментарии. Комментарий пишется только для того, чтобы люди могли понять код. Итак, очевидно, что они бесполезны для машины. Итак, препроцессор удаляет их все, так как они не нужны при выполнении и выполняться не будут.

      Вот как увидеть файл с удаленными комментариями в linux) :
      Напишите код C (пусть имя файла будет prog.c ). Предварительно обработайте его с помощью команды gcc -E prog.c .


      Вы увидите вывод с кодом без комментариев.

      Этот файл сохраняется с расширением «.i» (prog.i), которое будет использоваться компилятором.

    2. Включение файлов: Включая все файлы из библиотеки, которые нужны нашей программе. В HLL мы пишем #include , что является директивой для препроцессора, которая говорит ему включить содержимое указанного библиотечного файла. Например, #include указывает препроцессору включить все содержимое библиотечного файла stdio.h.
      Это также можно записать в двойных кавычках – #include «stdio.h»
      Примечание: Если имя файла заключено в угловые скобки, файл ищется в стандартных путях включения компилятора. Если имя файла заключено в двойные кавычки, путь поиска расширяется, чтобы включить текущий исходный каталог.
    3. Расширение макроса: Макросы можно вызывать как небольшие функции, которые не требуют больших затрат для обработки. Если нам нужно написать функцию (имеющую небольшое определение), которую нужно вызывать рекурсивно (снова и снова), то мы должны предпочесть макрос функции.
      Итак, определение этих макросов осуществляется препроцессором.
        #define SI 1000  

      — простой пример макроса.

    Эта статья предоставлена ​​ Diksha . Если вам нравится GeeksforGeeks и вы хотели бы внести свой вклад, вы также можете написать статью, используя submit. geeksforgeeks.org, или отправить свою статью по адресу [email protected]. Посмотрите, как ваша статья появится на главной странице GeeksforGeeks, и помогите другим гикам.

    Пожалуйста, пишите комментарии, если вы обнаружите что-то неправильное, или вы хотите поделиться дополнительной информацией по теме, обсуждаемой выше.

    Статьи по теме

    Что нового

    Мы используем файлы cookie, чтобы обеспечить вам максимальное удобство просмотра нашего веб-сайта. Используя наш сайт, вы подтверждаете, что вы прочитали и поняли наши Политика использования файлов cookie & Политика конфиденциальности

    Макросы (C/C++) | Microsoft Узнайте

    Редактировать

    Твиттер LinkedIn Фейсбук Эл. адрес

    • Статья
    • 2 минуты на чтение

    Препроцессор расширяет макросы во всех строках, кроме директив препроцессора

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

    Директива #define обычно используется для связывания значимых идентификаторов с константами, ключевыми словами и часто используемыми операторами или выражениями. Идентификаторы, представляющие константы, иногда называются символические константы или константы манифеста . Идентификаторы, представляющие операторы или выражения, называются макросами . В этой документации препроцессора используется только термин «макрос».

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

    На практике существует два типа макросов. Объектно-подобные макросы не принимают аргументов. Макросы, подобные функциям , могут быть определены для приема аргументов, чтобы они выглядели и действовали как вызовы функций. Поскольку макросы не генерируют фактические вызовы функций, иногда вы можете ускорить работу программ, заменив вызовы функций макросами. (В C++ встроенные функции часто являются предпочтительным методом.) Однако макросы могут создавать проблемы, если вы не будете их определять и использовать с осторожностью. Возможно, вам придется использовать круглые скобки в определениях макросов с аргументами, чтобы сохранить надлежащий приоритет в выражении. Кроме того, макросы могут неправильно обрабатывать выражения с побочными эффектами. Для получения дополнительной информации см. 9Пример 0108 getrandom в директиве #define.

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

    Директива #undef удаляет определение макроса. После того как вы удалили определение, вы можете переопределить макрос с другим значением. Директива #define и директива #undef обсуждают #define и #undef директивы соответственно.

    Для получения дополнительной информации см.

    • Макросы и C++

    • Макросы Variadic

    • Предопределенные макросы

    См.

    Оставить комментарий

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

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