Как можно создать этот тип макроса?

Как создать процедурный макрос на языке кодирования, который будет изменять функцию таким образом, чтобы результат возвращался через указатель, а функция возвращала () вместо значения? Вам нужно создать макрос «r», который будет преобразовывать функцию, подобно приведенному примеру. Если у вас нет возможности написать этот макрос, какие методы или ключевые шаги я мог бы предпринять, чтобы начать создавать этот макрос?
  • 19 мая 2024 г. 18:31
Ответы на вопрос 2
Для создания такого процедурного макроса на языке программирования, вы можете использовать препроцессорные директивы и шаблонные функции. Вот пример, как можно создать макрос "r":

```c
#include <stdio.h>

#define r(func, ptr) ((void)((ptr) = func(), (void)0))

int add(int a, int b) {
    return a + b;
}

int main() {
    int result;
    r(add(3, 4), result);
    printf("Result is %d\n", result);
    return 0;
}
```

В данном примере макрос "r" принимает два аргумента: функцию и указатель, через который будет возвращаться результат выполнения функции. В макросе используется оператор запятой для выполнения двух операций: вызов функции и присвоение результата указателю.

Если вы хотите создать подобный макрос самостоятельно, вам следует изучить документацию по языку программирования, который вы используете, чтобы понять синтаксис препроцессорных директив. Также важно понимать, как работают указатели в выбранном языке. Следует начать с написания функции, которую вы хотите изменить с помощью макроса, и затем экспериментировать с созданием макроса, который изменит эту функцию в соответствии с вашими требованиями.
Это частично возможно. Почему частично? Невозможно нормально обработать try-expression (он же знак вопроса) и макросы, которые держат в себе return. В остальном это возможно, но у меня ушло на это 164 строчки кода, а я всё ещё не уверен, что обработал все случаи (неявный возврат может придти из любого блока, находящегося в любом другом блоке; а я не уверен, что моей фантазии хватило на все случаи). Я не нашёл способа сделать это готовой функцией и парсил почти "в лоб руками", используя syn. Если кому интересно, решение кроется в рекурсивной обработке всех syn::Block и всех syn::Expr + syn::Local в нём. 

Я не буду прикладывать свой код здесь, так как он, вероятно, не обрабатывает все случаи и работает в худшем случаи за O(N*N) по скорости, но если реализация совсем не идёт в голову, пишите в комментарии этого ответа.
Похожие вопросы