Неожиданная проблема с макросами (точнее без макросов)

Моя цель - предложение широкого ассортимента товаров и услуг на постоянно высоком качестве обслуживания по самым выгодным ценам.

image


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


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


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


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


Суть проблемы


Макросы можно определять как с аргументами, так и без аргументов. Причем, макропроцессор считает макроопределение с аргументами и без оных идентичными. Поэтому невозможно сделать два #define со скобками и без них:


    #define MACRO   name
    #define MACRO() name() <-  error: 'MACRO' macro redefined [-Werror,-Wmacro-redefined]

Предположим, у нас есть переменная, имя которой нужно изменять во время компиляции, например, в зависимости от каких либо условий. И в общем виде это решается элементарно #define NAME new_name. То же самое можно сделать и для функции #define FUNC(...) func_name(__VA_ARGS__). А так как имена переменных и функций должны быть уникальны в своей области видимости, то и с определениями макросов, кажется, нет каких либо проблем, т.к. уникальность имен требуется как для препроцессора, так и для компилятора.


    #define FUNC(...) func_name(__VA_ARGS__)
    int func_name=0; <- error: redefinition of 'func_name' as different kind of symbol

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


    #define NAME(...)  name(__VA_ARGS__)

    int NAME(int arg=1){
        return arg;
    }

    int res = NAME();
    auto ref = &NAME; <- error: use of undeclared identifier 'NAME'

Рабочий вариант:


    #define NAME  name

    int NAME(int arg=1){
        return arg;
    }

    int res = NAME();
    auto ref = &NAME;

Внимание, вопрос.


Как не используя макросы препроцессора С/С++ можно переопределить имя функции как при её вызове, так и для операции взятия адреса функции? Мне кажется, что я перепробовал все варианты, но решения так и не нашел.

Источник: https://habr.com/ru/post/721908/


Интересные статьи

Интересные статьи

Компания “Волжское пароходство” —  это больше 3 тысяч сотрудников, часть из которых используют Битрикс24 во время перевозок. По пути следования судна интернет не везде стабильный, поэтому нужен б...
Выйдя на сушу, мы захватили с собой в дорогу немного моря. Тонкая мембрана одноклеточных так легко пропускала соленую воду с кислородом и питательными веществами, что эволюция даже не попыталась реали...
В прошлой части мы поговорили о советах директору по разработке бизнес-процесса в Битрикс24, сейчас же я постараюсь дать советы руководителям отделов, поскольку по моему опыту почти всегд...
Те, кто собираются открывать интернет-магазин, предварительно начитавшись в интернете о важности уникального контента, о фильтрах, накладываемых поисковиками за копирование материалов с других ресурсо...
Александр Епанешников, 19-летний российский студент, формально является слепым *. Недавно он решил, что хочет быть более независимым и меньше полагаться на маму при поездках в школу. Путь до школ...