2016-07-05 3 views
1

Рассмотрим:Повторное использование кусок кода в C

#include<stdio.h> 

#define BULK_UPDATER while(1){ \ 
         x=y=++z; \ 
         break; \ 
        } 

int main(void) 
{ 
    int x,y,z; //defined 
    x=y=z=100; 
    BULK_UPDATER; 
    printf("x : %d y : %d z : %d\n",x,y,z); 
return 0; 
} 

Цикл while(1) делает полное заявление и поэтому допускается с #define здесь. Идея состоит в том, чтобы повторно использовать фрагмент кода, который часто появляется. Этот тест не имеет никакого смысла, но я надеюсь, что мое намерение ясно.

Есть ли альтернатива/лучший способ сделать это?

+5

почему шкура логика, как это? вместо этого создайте метод/функцию? –

+0

Создание метода рекомендуется альтернативным способом. – CinCout

+4

Если вы должны использовать этот макрос (сомнительное предложение), используйте '#define bulk_updater do {x = y = ++ z; } while (0) ', чтобы вы могли использовать' if (something == otherthing) bulk_updater; else ... '. Если вы используете 'while', вы создадите синтаксическую ошибку. –

ответ

2

Конечно, есть альтернативы. Прежде всего, тело макроса не так велико. Сравните:

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) 
1

Пусть говорят, что вы хотите использовать функцию, чтобы сделать обновление, но вы не хотите, накладные расходы во время выполнения, что функция вводит (так как вы делаете небольшую операцию внутри функции)

Так использовать macro functions. В этом случае,

#include<stdio.h> 

#define BULK_UPDATER(a,b,c) a = b = ++c 
int main(void) 
{ 
    int x,y,z; //defined 
    x=y=z=100; 
    BULK_UPDATER(x,y,z); 
    printf("x : %d y : %d z : %d\n",x,y,z); 

    BULK_UPDATER(x,y,z); 
    printf("x : %d y : %d z : %d\n",x,y,z); 

    int x1,y1,z1 = 45; 
    BULK_UPDATER(x1,y1,z1); 
    printf("x1 : %d y1 : %d z1 : %d\n",x1,y1,z1); 
return 0; 
} 

Выход:

x : 101 y : 101 z : 101 
x : 102 y : 102 z : 102 
x : 46 y : 46 z : 46 
Смежные вопросы