从C宏创建字符串列表和枚举列表

为了使我的代码更短,更容易改变,我想替换类似的东西

enum{ E_AAA, E_BBB, E_CCC };
static const char *strings{"AAA", "BBB", "CCC" };

有一个宏,像INIT(AAA,BBB,CCC);但是当我尝试使用变量参数做一个宏,并且在字符串化时我收到一个错误,因为没有声明参数。

任何想法如何做到这一点?

这是我前几天学到的一个解决方案。出现您的问题的简化版本是:

#define ENUM_MACRO(name, v1, v2, v3, v4, v5, v6, v7)\
    enum name { v1, v2, v3, v4, v5, v6, v7};\
    const char *name##Strings[] = { #v1, #v2, #v3, #v4, #v5, #v6, #v7};

ENUM_MACRO(Week, Sun, Mon, Tue, Wed, Thu, Fri, Sat);

但是您可以使用一个函数调用来改进版本,如下所示:

#define ENUM_MACRO(name, v1, v2, v3, v4, v5, v6, v7)\
    enum name { v1, v2, v3, v4, v5, v6, v7};\
    const char *name##Strings[] = { #v1, #v2, #v3, #v4, #v5, #v6, #v7};\
    const char *name##ToString(value) { return name##Strings[value]; }

ENUM_MACRO(Week, Sun, Mon, Tue, Wed, Thu, Fri, Sat);

这将成长为:

  enum Week { Sun, Mon, Tue, Wed, Thu, Fri, Sat}; 
  const char *WeekStrings[] = { "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"}; 
  const char *WeekToString(value) { return WeekStrings[value]; };

您甚至可以使用第一个元素的偏移量,如下所示:

#define ENUM_MACRO(name, offset, v1, v2, v3, v4, v5, v6, v7)\
    enum name { v1 =  offset, v2, v3, v4, v5, v6, v7};\
    const char *name##Strings[] = { #v1, #v2, #v3, #v4, #v5, #v6, #v7};\
    const char *name##ToString(value) { return name##Strings[value - offset ]; }

ENUM_MACRO(Week, 1, Sun, Mon, Tue, Wed, Thu, Fri, Sat);

我希望这有帮助。

保重,
贝乔

参考:

Print the month question,Kush,Danny Varod的回答

翻译自:https://stackoverflow.com/questions/5530248/creating-a-string-list-and-an-enum-list-from-a-c-macro

转载注明原文:从C宏创建字符串列表和枚举列表