簡體   English   中英

使用枚舉的 C 宏

[英]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;
}

解決辦法是:

  • 要么 100% 依賴預處理器(如上面的解決方案所示)
  • 或者 100% 依賴編譯器(使用枚舉和真實的if語句)

正如其他人所說,在enum值已知之前,預處理器在編譯的早期階段執行其轉換。 所以你不能在#if做這個測試。

但是,您可以只使用普通的if語句。 任何啟用優化的體面編譯器都會檢測到您正在比較常量,在編譯時執行測試,並丟棄永遠不會執行的代碼。 因此,您將獲得與嘗試使用#if實現的結果相同的結果。

但我希望它像上面描述的那樣工作。

您的意思似乎是希望預處理器能夠識別枚舉常量,並==評估==表達式。 恐怕你倒霉了。

預處理器對枚舉一無所知。 它在一個主要是原始的令牌和空白流上運行。 當它評估一個指令時,例如

#if (operation == SUB)

它首先執行宏展開以產生

#if (ADD == SUB)

. 然后它必須以某種方式將標記ADDSUB轉換為數字,但同樣,它對枚舉或前面代碼的 C 意義一無所知。 將此類符號解釋為數字的規則很簡單:將每個符號都替換為 0。結果是代碼中的所有三個預處理器條件將始終評估為真。

如果您希望預處理器執行此操作,則需要為預處理器定義符號。 由於您沒有以其他方式使用枚舉,因此您不妨將其完全替換為

#define ADD 1
#define SUB 2
#define MUL 3

如果您也想要枚舉,那么只需在預處理器中使用與枚舉常量不同的符號即可。 您可以根據需要使用相同或不同的值,因為這兩個值永遠不會相遇。

另一種解決方案是在包含的頭文件中包含枚舉。

暫無
暫無

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

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