簡體   English   中英

在C中打印枚舉映射映射

[英]Print enum mapping mapping in C

我經常在C中使用enum來訪問具有數值數據的數組元素,例如

#define KEYS_MAX 1
#define FIELD_MAX 2

enum {FIELD1=0, FIELD2};

double array[KEYS_MAX][FIELD_MAX];
array[1][FIELD1] = 1.0; array[1][FIELD2] = 2.0;

然后,我將數據打印到KEYS_MAX行和FIELD_MAX列中的文件中。 為了以后知道這些列的內容,我想打印一個標題行。

# KEY FIELD1 FIELD2
1 1.0 2.0

我希望有一個例程可以在運行時正確地執行此操作,即使我僅通過更改enum更新代碼也是如此。 即,如何使用C代碼打印標題行,以及如何使用與enum更新無關的固定例程打印宏?

我發現了這一點: 在C ++中將枚舉值映射到字符串 ,但是我更喜歡在intel編譯器中也可以使用的東西。

您可以玩一些預處理技巧。 例如,在GCC源代碼樹實現中,您可能會受到gcc/tree.def文件的啟發。

因此,您可能只有一個文件,例如myenum.def ,其中包含諸如

MYENUM(Pink)
MYENUM(Red)
MYENUM(Ivory)

然后,您可以使用以下代碼定義枚舉

enum my_enum {
#define MYENUM(Name) Name,
#include "myenum.def"
#undef MYENUM
};

(您可能想要把None_在之前#include之上, Last_后)

然后你可以用一個枚舉到字符串轉換器,例如

const char* myenum_to_string(enum my_enum en) {
  switch(en) {
#define MYENUM(Name) case Name: return #Name;
#include "myenum.def"
#undef MYENUM
  default: return NULL; /* should not happen */
  }
}

你可能有一個字符串到枚舉轉換器,例如

enum myenum string_to_my_enum (const char*str) {
#define MYENUM(Name) if (!strcmp(str, #Name)) return Name;
#include "myenum.def"
#undef MYENUM
  else abort ();
}

以上所有都是常見的做法,並不局限於特定的編譯器(它應與gccclangtccicc或任何符合C99的編譯器一起使用)。

另外,如果您有一個龐大的代碼庫(而不是可以使用最新的gcc ),並且其中有數百個enum並且您不想對每個小技巧都使用這種技巧,則可以例如開發一個GCC插件或擴展(例如在MELT中)以使用代碼GCC內部的內部表示生成僅來自enum聲明的類似C代碼。 如果您正在編寫新軟件,或者您非常了解軟件基礎,​​則可以用類似的技巧替換enum代碼。

暫無
暫無

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

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