[英]C macros using enum
我試圖通過定義操作類型來使用 #if 宏來調用正確的代碼,所以我做了一個非常簡單的例子,類似於我想要做的:
#include <stdio.h>
enum{ADD,SUB,MUL};
#define operation ADD
int main()
{
int a = 4;
int b = 2;
int c;
#if (operation == ADD)
c = a+b;
#endif
#if (operation == SUB)
c = a-b;
#endif
#if (operation == MUL)
c = a*b;
#endif
printf("result = %i",c);
return 0;
}
但不幸的是,這不起作用我得到以下result = 8
...如果我用數字替換操作它工作正常......但我希望它像上面描述的那樣工作。
任何幫助
預處理器是在實際編譯器看到代碼之前(在某種程度上)完成的一個步驟。 因此,它不知道枚舉或它們的值,因為它們是在預處理之后進行的編譯期間設置的。
您根本無法使用枚舉來使用預處理器條件編譯。
預處理器將始終認為這是錯誤的:
#if IDENT == IDENT
它只能測試數值。
簡化您的代碼並將其提供給預處理器:
enum {ADD,SUB,MUL};
#define operation ADD
int main()
{
(operation == ADD);
}
預處理器輸出的結果是:
enum {ADD,SUB,MUL};
int main()
{
(ADD == ADD);
}
如您所見,尚未評估 enumerate 值。 在#if
語句中,該表達式僅被視為false 。
因此,一種解決方法是將您的枚舉替換為一系列#define
:
#define ADD 1
#define SUB 2
#define MUL 3
像這樣它的工作原理。 預處理器輸出的輸出現在是:
int main()
{
int a = 4;
int b = 2;
int c;
c = a+b;
# 28 "test.c"
printf("result = %i",c);
return 0;
}
解決辦法是:
if
語句)正如其他人所說,在enum
值已知之前,預處理器在編譯的早期階段執行其轉換。 所以你不能在#if
做這個測試。
但是,您可以只使用普通的if
語句。 任何啟用優化的體面編譯器都會檢測到您正在比較常量,在編譯時執行測試,並丟棄永遠不會執行的代碼。 因此,您將獲得與嘗試使用#if
實現的結果相同的結果。
但我希望它像上面描述的那樣工作。
您的意思似乎是希望預處理器能夠識別枚舉常量,並==
評估==
表達式。 恐怕你倒霉了。
預處理器對枚舉一無所知。 它在一個主要是原始的令牌和空白流上運行。 當它評估一個指令時,例如
#if (operation == SUB)
它首先執行宏展開以產生
#if (ADD == SUB)
. 然后它必須以某種方式將標記ADD
和SUB
轉換為數字,但同樣,它對枚舉或前面代碼的 C 意義一無所知。 將此類符號解釋為數字的規則很簡單:將每個符號都替換為 0。結果是代碼中的所有三個預處理器條件將始終評估為真。
如果您希望預處理器執行此操作,則需要為預處理器定義符號。 由於您沒有以其他方式使用枚舉,因此您不妨將其完全替換為
#define ADD 1
#define SUB 2
#define MUL 3
如果您也想要枚舉,那么只需在預處理器中使用與枚舉常量不同的符號即可。 您可以根據需要使用相同或不同的值,因為這兩個值永遠不會相遇。
另一種解決方案是在包含的頭文件中包含枚舉。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.