#include<iostream>
int func(int, int);
#define func(x,y) x/y+x
int main()
{
    int i, j;

    scanf("%d", &i);
    scanf("%d", &j);

    printf("%d ", func(i + j, 3));
    printf("%d\n", func(i + j, 3));

}

int func(int x, int y) {
    return y / x + y;
}

Что следует добавить к этому коду, чтобы 1-й вывод был результатом макроса, а 2-й - результатом функции?

c++
4
Satyaki Majumder 20 Авг 2018 в 15:07

3 ответа

Лучший ответ

Несколько путей:

printf("%d ", func(i + j, 3)); // Macro call
#undef func // Macro is no longer defined
printf("%d\n", func(i + j, 3)); // Function call

Или

printf("%d ", func(i + j, 3)); // Macro call
printf("%d\n", (func)(i + j, 3)); // Function call
11
Jarod42 20 Авг 2018 в 12:10

Одно из решений

printf("%d\n", (&func)(i + j, 3));

(&func) принимает адрес функции func. Поскольку он не имеет формы func(), здесь не выполняется подстановка макросов. Поскольку указатели на функции могут быть вызваны, поведение соответствует назначению.

0
MSalters 20 Авг 2018 в 13:24

Еще один способ:

#define EMPTY

printf("%d\n", func EMPTY (i + j, 3));

При просмотре в Boost.PP макрос EMPTY «прожигает» итерацию расширения, и полученный func(...) остается нетронутым.

2
Quentin 20 Авг 2018 в 13:30
51930406