簡體   English   中英

將參數傳遞給可變參數宏

[英]Passing arguments to variadic macro

#define SEND_VALUE(num, point1, point2, point3...) \
{ \
  char number[6]; \
  char p1[6];\
  char p2[6];\
  char p3[6];\
  if(num == ONE) {sprintf(number, "ONE");}\
  if(num == TWO) {sprintf(number, "TWO");}\
  if(num == THREE) {sprintf(number, "THREE");}\
  if(point1 == ONE) {sprintf(p1, "ONE");}\
  if(point1 == TWO) {sprintf(p1, "TWO");}\
  if(point1 == THREE) {sprintf(p1, "THREE");}\
  if(point2 == ONE) {sprintf(p2, "ONE");}\
  if(point2 == TWO) {sprintf(p2, "TWO");}\
  if(point2 == THREE) {sprintf(p2, "THREE");\
  if(point3 == ONE) {sprintf(p3, "ONE");}\
  if(point3 == TWO) {sprintf(p3, "TWO");}\
  if(point3 == THREE) {sprintf(p3, "THREE");\
  fprintf(fp,"%s:%s:%s:%s:\n",number, p1,p2,p3);\
  fflush(fp); \
  fprintf(fp,fmt,##__VA_ARGS__);\
  fflush(fp); \
  fprintf(fp,"\n");\
  fflush(fp); \
}

截至目前,該宏不需要是可變的。 但是為了將來使用,我希望它具有可變性。 我不知道如何在可變參數宏中編寫/定義參數列表以及如何使用它們。 如上,例如,p1,p2應該設置並打印。

我這樣稱呼這個宏:

SEND_VALUE(ONE, ONE, ONE, ONE);

有人可以幫忙實現這種可變的方式嗎?

假設您也將fmt作為宏參數,這是您的宏的簡化版本:

#define SEND_VALUE(num, point1, point2, point3, ...) \
do { \
  fprintf(fp,#num":"#point1":"#point2":"#point3":\n");\
  fflush(fp); \
  fprintf(fp,__VA_ARGS__);\
  fflush(fp); \
  fprintf(fp,"\n");\
  fflush(fp); \
} while(0)

如果要明確顯示格式,還可以執行以下操作:

#define SEND_VALUE(num, point1, point2, point3, fmt, ...) \
do { \
  fprintf(fp,#num":"#point1":"#point2":"#point3":\n");\
  fflush(fp); \
  fprintf(fp,fmt,##__VA_ARGS__);\
  fflush(fp); \
  fprintf(fp,"\n");\
  fflush(fp); \
} while(0)

但您應注意,##__VA_ARGS__是gcc擴展名。

一些注意事項:

  • 使用do { } while(0)可以將宏擴展為代碼塊以防萬一; 它們可以作為單個語句放在if / while / etc塊中,也可以接受; 沒有運行時開銷。
  • 使用#param獲取一個字符串,其值是參數名稱。 在您的示例SEND_VALUE(ONE, ONE, ONE, ONE)#num將為"ONE"
  • 在C語言中, "some"" string"等效於"some string"
  • 如果也將fp作為參數傳遞給宏,那會更好。

編輯:最后,您的宏可以這樣使用:

SEND_VALUE(ONE, ONE, ONE, ONE, "");
SEND_VALUE(ONE, TWO, ONE, THREE, "%d", 10);
SEND_VALUE(THREE, TWO, ONE, TWO, "format string! %s %s", "param1", "param2");

暫無
暫無

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

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