#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-й - результатом функции?
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
Одно из решений
printf("%d\n", (&func)(i + j, 3));
(&func)
принимает адрес функции func
. Поскольку он не имеет формы func()
, здесь не выполняется подстановка макросов. Поскольку указатели на функции могут быть вызваны, поведение соответствует назначению.
Еще один способ:
#define EMPTY
printf("%d\n", func EMPTY (i + j, 3));
При просмотре в Boost.PP макрос EMPTY
«прожигает» итерацию расширения, и полученный func(...)
остается нетронутым.
Похожие вопросы
Новые вопросы
c++
C ++ - это язык программирования общего назначения. Первоначально он был разработан как расширение C и имеет аналогичный синтаксис, но теперь это совершенно другой язык. Используйте этот тег для вопросов о коде (который будет скомпилирован с помощью компилятора C ++). Используйте тег, зависящий от версии, для вопросов, связанных с конкретной редакцией стандарта [C ++ 11], [C ++ 14], [C ++ 17] или [C ++ 20] и т. Д.