这是我正在try 做的事情的一个最小例子:

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,以符合我项目中当前的命名惯例.旧名称需要保留为别名,该别名将在兼容性头文件中声明.回到我的例子,enum color { RED, GREEN, BLUE }将位于主头文件中,typedef enum legacy_color enum color将位于向后兼容头文件中.

我能想到的唯一其他方法是#define legacy_color color,但它过于宽泛,并且会匹配enum类型上下文之外的内容.

请注意,typedef enum color legacy_color;是不可接受的,因为类型已从enum legacy_color更改为legacy_color.

推荐答案

除了宏(在这种情况下是有风险的)之外,没有办法做到这一点. 无法仅对enum标签进行别名(实际上,没有enum标签,只有标签,并且tag namespace在列举、 struct 和联合之间共享,这意味着 enum foostruct foo和/或union foo冲突,但不与普通名称foo(变量名或类型名;不重要)).

如果您想传达类型别名是enum,则可以将单词enum放入类型别名的名称中,例如,typedef enum legacy_color enum_color;.

C++相关问答推荐

try 使用libusb控制音量时LIBUSB_WRIGHT_PIPE

当main函数调用被重构时,C函数给出错误的结果

在C中使用动态内存分配找到最小的负数

堆栈帧和值指针

仅在给定的大小和对齐方式下正确创建全局

从纯C中访问通用项对话框

如何知道我是否从非阻塞套接字读取所有内容

当我更改编译优化时,相同的C代码以不同的方式运行

正确的TCP/IP数据包 struct

插座打开MacOS组件

在Linux上使用vscode和lldb调试用Makefile编译的c代码

用C++从外部ELF符号读取值

为什么函数是按照定义的顺序执行的,而不是按照从avr-c中的int main()调用的顺序执行的?

为什么编译器不能简单地将数据从EDI转移到EAX?

GetText不适用于包含国际字符的帐户名称

将某些内容添加到链接列表时,列表中的其他项将使用最后添加的项的名称

Matlab/Octave对conv2函数使用哪种方法?

如何解释数组中的*(ptr)和*(ptr+2)?

x86-64平台上的int_fast8_t大小与int_fast16_t大小

文件指针引起的C程序分段错误