[英]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.