Подстановка макросов с использованием блочной структуры в C (проблема K & R 4.14) - PullRequest
0 голосов
/ 14 января 2019

При попытке использовать блочную структуру в качестве «замещающего текста» с помощью оператора #define, например, ниже,

#define swap(t,x,y) { t _z;                     \
_z = x;                                     \
x = y;                                      \
y = _z;                }

Затем я пытаюсь использовать его с:

printf( "%.2f %.2f\n", pow(a,b), pow( swap(int,a,b) ) );

Но я получаю следующую ошибку компилятора

    414.c:14:21: error: expected expression before ‘{’ token
 #define swap(t,x,y) { t _z;   \
                     ^
414.c:27:41: note: in expansion of macro ‘swap’
   printf( "%.2f %.2f\n", pow(a,b), pow( swap(int,a,b) ) );
                                         ^~~~

Разве не разрешено использовать блочные структуры, подобные этой? Что если я захочу использовать локальную переменную для макроса?

В сообщении о проблеме специально сказано, что нужно использовать блочные структуры, и в «Книге ответов C» этот точный фрагмент кода используется в качестве решения.

Ответы [ 2 ]

0 голосов
/ 14 января 2019

Проблема в том, что ваш макрос расширен до:

{ int _z;
_z = a;
a = b;
b = _z; }

И скоро ваш звонок станет:

printf( "%.2f %.2f\n", pow(a,b), pow( { int _z; _z = a; a = b; b = _z; } ) );

Поскольку pow требует 2 аргумента и вы передаете блок, он не может скомпилироваться.

Разве не разрешено использовать блочные структуры, подобные этой?

Не в качестве аргумента для функции, которая ожидает 2 числовых аргумента (double, int или любой другой).

Что, если я хочу использовать локальную переменную для макроса?

Способ, которым вы объявили локальную переменную, верен.

0 голосов
/ 14 января 2019

Если макрос развернут

printf( "%.2f %.2f\n", pow(a,b), pow( swap(int,a,b) ) );

становится

printf( "%.2f %.2f\n", pow(a,b), pow( { int z; z=a; a=b; b=z} ) ) );

{} недопустимо в качестве выражения. Также пау принимает два параметра. Вы можете переписать его как

printf( "%.2f", pow(a,b));
swap(int,a,b);
printf( "%.2f\n", pow(a,b));
...