Конечно, есть альтернативы. Прежде всего, тело макроса не так велико. Сравните:
x=y=++z;
с
bulk_updater;
Макрос даже не сохранить ваши драгоценные пальцы или дисковое пространство. Является ли предыдущий или последний более читаемым, зависит от вас (лично я предпочитаю первое, поскольку ясно, что делает утверждение, и оно более компактно).
Вы также можете создать функцию, которая делает то, что вы хотите, но тогда вам придется отправить параметры, чтобы сделать это:
void bulk_updater(int* x, int* y, int *z) {
*x = *y = ++*z;
}
...
bulk_updater(&x, &y, &z);
Это еще не экономит ваши пальцы или дисковое пространство. Как всегда, что лучше, это вопрос мнения.
Более компактная версия функции может быть достигнуто за счет ввода x
, y
и z
в структуры:
struct xyz {
int x;
int y;
int z;
};
void bulk_update(struct xyz* p)
{
p->x = p->y = ++p->z;
}
...
struct xyz xyz;
bulk_update(&xyz);
Хотя это может показаться неуклюжим, это может быть оправдано, если у вас есть более значимые операции xyz
тройной.
Кстати, обычно рекомендуется использовать верхний регистр для имен макросов (так, чтобы кто-то знал, что это макрос). И если вы хотите, чтобы он работал как оператор, вы должны использовать вместо него do { ... } while(0)
, таким образом он будет действителен только с точкой с запятой и точкой с запятой после того, как не будет сделано два оператора (как это делает ваше решение):
#define BULK_UPDATER do { x=y=++z; } while(0)
почему шкура логика, как это? вместо этого создайте метод/функцию? –
Создание метода рекомендуется альтернативным способом. – CinCout
Если вы должны использовать этот макрос (сомнительное предложение), используйте '#define bulk_updater do {x = y = ++ z; } while (0) ', чтобы вы могли использовать' if (something == otherthing) bulk_updater; else ... '. Если вы используете 'while', вы создадите синтаксическую ошибку. –