簡體   English   中英

在C中重用一段代碼

[英]Reuse piece of code in 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允許這樣做。 我們的想法是重用一段經常出現的代碼。 這個測試用例根本沒有任何意義,但我希望我的意圖是明確的。

有沒有替代/更好的方法呢?

當然還有其他選擇。 首先,宏的身體並不那么大。 相比:

x=y=++z;

bulk_updater;

宏甚至不會保存您寶貴的手指或磁盤空間。 前者或后者是否更具可讀性取決於你(我個人更喜歡前者,因為它很清楚聲明的作用,而且更緊湊)。

您還可以創建一個能夠執行所需操作的函數,但之后您必須發送參數來執行此操作:

void bulk_updater(int* x, int* y, int *z) {
    *x = *y = ++*z;
}

...

bulk_updater(&x, &y, &z);

這甚至不會節省您的手指或磁盤空間。 一如既往,哪個更好是一個意見問題。

通過將xyz放在結構中,可以實現更緊湊的函數版本:

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)

假設您想使用函數來執行更新,但您不希望函數引入的運行時開銷(因為您在函數內部執行了一個小操作)

所以使用宏功能 對於這種情況,

#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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM