Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
Разработка программного обеспечения

Identifiers

Boost , Chapter 1. The Variadic Macro Data Library 1.9 , Specific macros for working with data types

Boost C++ Libraries

...one of the most highly regarded and expertly designed C++ library projects in the world. Herb Sutter and Andrei Alexandrescu, C++ Coding Standards

PrevUpHomeNext

Идентификатор в VMD является одним из двух предпроцессорных возможностей более низкого уровня:

  • предпроцессорный токен «идентификатор», который по сути представляет собой последовательность буквенно-цифровых символов и символ подчеркивания с первым персонажем, не являющимся числовым персонажем.
  • 'pp-номер', который является интегральным буквальным токеном.

Вот несколько примеров:

SOME_NAME
_SOME_NAME
SOME_123_NAME
some_123_name
sOMe_123_NAmE
2367
43e11
0
22
654792
0x1256
Problem testing any identifier

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

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

  • идентификатор, т.е. буквенно-цифровой или подчеркивающий
  • левый скобки

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

Если это не так, поведение не определено, и, скорее всего, произойдет ошибка предварительной обработки.

С учетом вклада:

's_anything' : can be tested
'S_anything' : can be tested
's_anYthiNg' : can be tested
'_anything' : can be tested
'_Anything' : can be tested
'_anytHIng' : can be tested
'24' : can be tested
'245e2' : can be tested
'(anything)' : can be tested, tuple
'(anything) anything' : can be tested, tuple and further input
'anything anything' : can be tested, identifier followed by space character
'%_anything' : undefined behavior and most likely a preprocessing error due to the constraint
'(_anything' : undefined behavior and most likely a preprocessing error due to the constraint, since a single '(' does not form a tuple
'44.3' : undefined behavior and most likely a preprocessing error due to the constraint since '.' is not alphanumeric
Identifying an identifier

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

#define BOOST_VMD_REGISTER_identifier (identifier)

где «идентификатор» является конкретным идентификатором, который мы хотим идентифицировать. Это называется в VMD регистрирующим макросом.

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

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

В данном блоке перевода потенциально может произойти, что регистрационные макросы были включены в заголовки файлов, которые не создал конкретный конечный пользователь VMD. Это также не должно приводить к конкретным проблемам, поскольку регистрация является процессом добавления идентификаторов для любого конкретного переводческого подразделения. Как мы увидим, у VMD есть макросы не только для поиска какого-либо идентификатора в вводе предпроцессора, но и для поиска какого-либо конкретного идентификатора в вводе препроцессора.

Testing for an identifier macro

Конкретный макрос, используемый для тестирования идентификатора в VMD, называется BOOST_VMD_IS_IDENTIFIER. Макро берет один требуемый параметр, который является входом для тестирования.

Когда мы ссылаемся на BOOST_VMD_IS_IDENTIFIER, он возвращает 1, если вход представляет любой зарегистрированный идентификатор, в противном случае он возвращает 0.

Пример:

#include <boost/vmd/is_identifier.hpp>
#define BOOST_VMD_REGISTER_yellow (yellow)
#define BOOST_VMD_REGISTER_green  (green)
#define BOOST_VMD_REGISTER_blue   (blue)
BOOST_VMD_IS_IDENTIFIER(some_input) // returns 1 if 'some_input' is 'yellow','green', or 'blue'
BOOST_VMD_IS_IDENTIFIER(some_input) // returns 0 if 'some_input' is 'purple'

По сути, только зарегистрированные идентификаторы могут быть найдены в VMD как идентификаторы.

Detecting a particular identifier

Хотя регистрация идентификатора позволяет VMD распознавать строку символов как идентификатор VMD, способность обнаруживать определенный идентификатор нуждается в конечном пользователе для определения другого макроса:

#define BOOST_VMD_DETECT_identifier_identifier

где «идентификатор» является конкретным идентификатором, который мы хотим обнаружить. Этот объектно-подобный макрос расширяется без вывода.

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

Термин для создания этого макроса заключается в том, что мы потенциально «предназначен» идентификатор, и я буду использовать термин, предварительно обнаруженный как процесс создания макроса BOOST_VMD_DETECT.

Способность обнаруживать, что идентификатор VMD является конкретным идентификатором, используется в макросах VMD, когда данные сравниваются для равенства/неравенства, а также когда мы хотим сопоставлять идентификатор с набором других идентификаторов. Эти ситуации будут объяснены позднее в документации, когда будет обсуждаться конкретная макрофункциональность. Если программист никогда не использует функциональность, которая охватывает эти ситуации, нет необходимости использовать предварительное обнаружение для зарегистрированного идентификатора.

Parsing identifiers and undefined behavior

Методика для парсирования идентификаторов, как только определено, что вход, будучи парсированным, не начинается с набора родительских шей, использует препроцессорное конкатирование в своем анализе. Этот метод включает в себя предпроцессорный оператор «##» для концентрата ввода, и изучить результаты этого конкатирования.

При использовании предпроцессорного конкатирования результат конкатирования должен быть действительным предпроцессорным токеном, иначе поведение препроцессора не определено. В C++ «неопределенное поведение» в целом означает, что может произойти что угодно. В практическом использовании, когда предпроцессорное конкатирование не производит действительный токен предварительной обработки, компилятор, скорее всего, вызовет ошибку предварительной обработки. Если компилятор решает не выдавать ошибку предварительной обработки, результат всегда будет означать, что удаление идентификатора будет неудачным. Но поскольку результат является неопределенным поведением, нет абсолютного способа, которым программист может определить, каким будет результат, когда будет использоваться предпроцессорное конкатирование, и вводимый вклад содержит предпроцессорный ввод, который не отвечает ограничениям для анализа идентификатора, упомянутого в начале этой темы.

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

Usage

Для использования макроса BOOST_VMD_IS_IDENTIFIER либо включает общий заголовок:

#include <boost/vmd/vmd.hpp>

или включить конкретный заголовок:

#include <boost/vmd/is_identifier.hpp>

PrevUpHomeNext

Статья Identifiers раздела Chapter 1. The Variadic Macro Data Library 1.9 Specific macros for working with data types может быть полезна для разработчиков на c++ и boost.




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



:: Главная :: Specific macros for working with data types ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-08-30 11:47:00
2025-05-20 05:12:52/0.0051209926605225/0