簡體   English   中英

計算預處理器宏

[英]Counting preprocessor macros

我有這個宏代碼,它允許我使用一個構造將C枚舉和枚舉名稱列表定義為字符串。 它阻止我不得不復制枚舉器名稱(並可能為大型列表引入錯誤)。

#define ENUM_DEFINITIONS(F) \
  F(0, Item1) \
  F(5, Item2) \
  F(15, Item3) \
  ...
  F(63, ItemN)

然后:

enum Items {
  #define ITEM_ENUM_DEFINE(id, name) name = id,
    ENUM_DEFINITIONS(ITEM_ENUM_DEFINE)
  #undef ITEM_ENUM_DEFINE

當擴展時,應該產生:

enum Items {
  Item1 = 0,
  Item2 = 5,
  Item3 = 15,
  ...
  ItemN = 63,
}

在實現文件中,我有這個代碼:

const char* itemNames[TOTAL_ITEMS];
int iter = 0;

#define ITEM_STRING_DEFINE(id, name) itemNames[iter++] = #name;
  ENUM_DEFINITIONS(ITEM_STRING_DEFINE)
#undef ITEM_STRING_DEFINE

當擴展時,產生:

itemNames[iter++] = "Item1";
itemNames[iter++] = "Item2";
itemNames[iter++] = "Item3";
...
itemNames[iter++] = "ItemN";

我想知道我以這種方式創建了多少枚舉項,並能夠將它傳遞給編譯時數組。 在上面的示例中,這將在編譯時確定TOTAL_ITEMS = N. 是否可以用這種方式計算宏調用?

我已經看到過提到一個非標准的COUNTER宏,類似於FILELINE宏,但我希望有更標准的方法。

也有興趣聽聽是否有更好的方法來實現這一點,而不必使用宏。

以下應該有效:

#define ITEM_STRING_DEFINE(id, name) #name, // note trailing comma
const char *itemNames[] = {
  ENUM_DEFINITIONS(ITEM_STRING_DEFINE)
};

#define TOTAL_ITEMS (sizeof itemNames / sizeof itemNames[0])

編輯 :感謝Raymond Chen注意到我們不必擔心列表中不必要的最終逗號。 (對於使用嚴格C89編譯器的枚舉問題,我一直在誤解這個問題,因為是否需要使用C enum中的最后一個逗號?

您可以使用相同的技術來計算調用。

enum itemscounter  { 
  #define ITEM_ENUM_DEFINE(id, name) name##counter,
    ENUM_DEFINITIONS(ITEM_ENUM_DEFINE) 
  #undef ITEM_ENUM_DEFINE 
 TOTAL_ITEMS
};

也有興趣聽聽是否有更好的方法來實現這一點,而不必使用宏。

您總是可以使用ruby或python等腳本語言為您生成.c和.h文件。 如果做得好,可以將腳本集成到Makefile中。

我知道這不是一個完整的答案。 你可以圍繞這樣的東西創建一個宏。

#include <stdio.h>

const char * array[] = {
  "arr1", "arr2", "arr3", "arr4"
};

int main (int argc, char **argv)$
{
  printf("%d\n", sizeof(array)/sizeof(const char *));
}

如果你可以修改你的enum所以它有連續的元素你可以這樣做(來自Boost)

enum { A=0,B,C,D,E,F,N };
const char arr[N]; // can contain a character for each enum value

查看建議Mu Dynamics'Enums ,Strings and Laziness' ; 這些至少與你所追求的有關。

否則,請查看Boost預處理器集合(可與C預處理器以及C ++預處理器一起使用)。

暫無
暫無

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

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