簡體   English   中英

通過 for 循環將值傳遞給宏

[英]Passing values to macros by for loop

我想通過for循環將值傳遞給宏,但是當我嘗試傳遞值時會出錯,請盡快幫助 m。 i值作為 Valve(i) 傳遞給宏時,它會給出錯誤

我的代碼如下:

#define Valve(x) stTest.bValve##x##_Cmd

typedef struct OperationFlags
{
   int bValve1_Cmd;
   int bValve2_Cmd;
}FLAGS_TypeDef;

void main(void)
{
  FLAGS_TypeDef stTest;
  int j,i;

  stTest.bValve1_Cmd = 4;
  stTest.bValve2_Cmd = 9;

  for(i=1;i<=2;i++)
  {
    j=Valve(1);
    printf("%d",j);
  } 

}

這是正常的! 預處理器(處理宏的“東西”)在 C 編譯器之前運行。 因此,它僅在生成可編譯代碼時才有效。

在您的情況下,如果您使用顯示的代碼

j=Valve(1)

它將為該值工作,因為它將產生:

j=stTest.bValve1_Cmd

但它只會使用該值執行整個循環。 當您使用“i”更改參數“1”以實際執行循環時,它將產生:

j=stTest.bValvei_Cmd

這是無效的。

要做你想做的事,只需使用一個向量:

typedef struct OperationFlags
{
 int bValve_Cmd[2];
}FLAGS_TypeDef;
#define Valve(x) stTest.bValve_Cmd[x]
//....
for(i=1;i<=2;i++)
{
 j=Valve(1);
 printf("%d",j);
}

宏替換是在運行之前做得很好,所以你不能用一個變量X包含值2得到stTest.bValve2_Cmd 相反,您將獲得stTest.bValveX_Cmd ,其中不存在符號。

您必須找到另一種方法來執行此操作,例如擁有一個可以使用X選擇的值數組:

#define Valve(x) stTest.bValveX_Cmd[x]

typedef struct OperationFlags {
   int bValveX_Cmd[2];
} FLAGS_TypeDef;

試試這個#define Valve(x) (x == 1 ? stTest.bValve1_Cmd : stTest.bValve2_Cmd)


#define Valve(x) (*(&stTest.bValve1_Cmd + (x-1)))

注意:如果環境改變,它可能不起作用。 它也不能用於位域。

添加檢查

#define Valve(x) (*(&stTest.bValve1_Cmd + (x-1))); \
assert(offsetof(FLAGS_TypeDef, bValve2_Cmd) == sizeof(int))

暫無
暫無

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

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