这是我正在尝试做的一个最小示例:
enum color { RED, GREEN, BLUE };
typedef enum legacy_color enum color;
int
main(void)
{
return 0;
}
编译失败
test.c:13:27: error: two or more data types in declaration specifiers
13 | typedef enum legacy_color enum color;
| ^~~~
test.c:13:32: warning: empty declaration with storage class specifier does not redeclare tag
13 | typedef enum legacy_color enum color;
| ^~~~~
动机:我需要重命名枚举以符合项目中当前的命名约定。旧名称需要保留为别名,它将在兼容性头文件中声明。回顾我的示例,
enum color { RED, GREEN, BLUE }
将位于主头文件中,而 typedef enum legacy_color enum color
将位于向后兼容头文件中。
我能想到的唯一其他方法是
#define legacy_color color
,但这过于宽泛,并且会在枚举类型上下文之外匹配。
请注意,
typedef enum color legacy_color;
是不可接受的,因为类型已从 enum legacy_color
更改为简单的 legacy_color
。
你有
typedef
向后的语法。定义的名称出现在最后。你也不要重复enum
。使用
typedef enum color legacy_color;
这将使
legacy_color
成为您在上一行定义的枚举的同义词。
enum color { RED, GREEN, BLUE };
typedef enum color legacy_color;
legacy_color foo = GREEN;
enum color bar = BLUE;
int
main(void)
{
return 0;
}