Страницы

Поиск по вопросам

суббота, 23 марта 2019 г.

Создание макрос-функции в C++

Задача стоит написать функцию-макрос. Сама функция написано и даже один раз корректно срабатывает. Вот она:
#define maximum(x, y, r) int aa=x; int bb=y; r = ((aa) > (bb) ? (aa) : (bb))/* присвойте в r максимум из x и y */
Но при повторном вызове компилятор выдает ошибки вида:
error: redeclaration of 'int aa' error: 'int aa' previously declared here
Помогите разобраться в причине, пожалуйста


Ответ

Прежде всего мне представляется, что вы имели в виду что-то подобное:
#define maximum(x, y, r) \ do { int aa = ( x ); int bb = ( y ); ( r ) = bb < aa ? aa : bb; } while ( false )
Предвидя ваш вопрос, почему используется конструкция do-while, скажу, чтобы, например, этот макрос можно было бы использовать в if-else предложении:
if ( x > 0 && y > 0 ) maimum( x, y, r ); else maximum( x = -x, y = -y, r );
Ниже представлена демонстрационная программа
#include
#define maximum(x, y, r) \ do { int aa = ( x ); int bb = ( y ); ( r ) = bb < aa ? aa : bb; } while ( false )
int main() { int x = -10, y = -5, r;
if ( x > 0 && y > 0 ) maximum( x, y, r ); else maximum( x = -x, y = -y, r );
std::cout << "x = " << x << ", y = " << y << ", r = " << r << std::endl; }
Ее вывод на консоль:
x = 10, y = 5, r = 10
Что касается вашего определения макроса, то он постоянно определяет переменные aa и bb в той области видимости, где макрос вызывается.
#define maximum(x, y, r) int aa=x; int bb=y; r = ((aa) > (bb) ? (aa) : (bb))
Поэтому компилятор выдает сообщение об ошибке, что эти переменные были уже определены, если макрос вызывается более одного раза.
Использование макросов в C++ - это анахронизм. Лучше использовать встраиваемые функции, то есть функции со спецификатором inline. Более того в C++ уже есть стандартная функция std::max. Поэтому вы могли бы просто написать
r = std::max( x, y );
Имейте в виду, что поведение вашего макроса отличается от поведения аналогичной стандартной функции std::max. Ваш макрос в случае равенства x и y возвращает y, тогда как стандартная функция std::max возвращает x. И кроме того вы используете оператор > тогда как стандартная функция использует оператор <. Для фундаментальных типов это может не играть существенной роли, тогда как для определенных пользователем типов это имеет важное значение.
А самое главное - ваш макрос нельзя использовать в выражениях. Это ограничивает его применение.

Комментариев нет:

Отправить комментарий