LINUX.ORG.RU

С макросы


0

0

Как заставить С-шный макрос возвращать значенние как функтция.

Например:

#define MY_SUPER_PUPER_MACRO(a,c) ....

...

var=MY_SUPER_PUPER_MACRO(var1,var2);

...

В этом случае я хочу, чтобы переменной var было присвоено значение, которое является результатом вычисления MY_SUPER_PUPER_MACRO(var1,var2). А данный макрос не обязательно однострочный... В смысле может быть последовательностю нескольких команд

Похоже про ; не все поняли, а злой tailgunner толком не объяснил. Попробую развеять мрак :) Если вдруг все всё поняли, может другим читающим будет полезно.

#define M1(x) do { foo(x); foo2(); } while (0)
#define M2(x) do { foo(x); foo2(); } while (0);

void m1(int x) { foo(x); foo2(); }

два макроса. Вообще желательно, чтобы макросы для программиста-пользователя семантически не отличались от вызова функций. Они, конечно, отличаются (поэтому их пишут заглавными буквами), но к неотличению нужно стремиться.

M1(1);
M2(1);
m1(1);

здесь всё нормально. Но вот нехороший однострочный if всё портит! (кстати, во многих codestyle-ах он просто запрещён, нужно всегда ставить блок { ... }. В этом есть смысл).

if (1) m1(2); else m1(3);

здесь всё работает нормально, ещё бы.

if (1) M1(2); else M1(3);

здесь всё тоже работает нормально.

if (1) M2(2); else M2(3);

а здесь ошибка компиляции.

Кстати именно из за этого для многострочных макросов используют такую странную на первый взгляд конструкцию, а не обычный { ... }.

В общем это те грабли, про которые нужно знать.

Legioner ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.