无法重新定义枚举 typedef

Posted

技术标签:

【中文标题】无法重新定义枚举 typedef【英文标题】:cant re-def enum type def 【发布时间】:2012-10-01 12:45:20 【问题描述】:

我有 bool typedef 的代码

typedef enum bool 
    false,
    true,
 bool;

在两个头文件中,如果最终父头文件中没有包含它,则子 C 文件当然不能使用 bool 类型,尽管也定义了它的较小头文件的子文件可以。

但是,如果我在最终的父头文件中定义它,那么较小的头文件定义错误“布尔已在当前范围内声明”

我需要一个针对较小标头的解决方案,它可能包含在可能已经或可能尚未定义 bool 的项目中......最好的方法是什么??

【问题讨论】:

请注意,在 C99 (#include <stdbool.h>) 中添加了布尔类型。 不幸的是,我在这种环境中没有可用的 stdbool.h ... :( 【参考方案1】:

首先,如果您使用的是 C99 或更高版本的编译器,stdbool.h 中已经定义了标准布尔类型。

其次,您通常可以避免直接针对 truefalse 值进行测试,多年来我发现这实际上会导致代码更易于阅读且不易出错(这只是不过个人意见——YMMV)。

直接的解决方案是在你的 typedef 周围加上一个包含保护:

#ifndef BOOL_DEFINED
#define BOOL_DEFINED
typedef enum bool 
  false,
  true
 bool;
#endif

这将防止类型被多次声明。但是,正如您所发现的,将相同的类型定义放在两个不同的标头中会导致胃灼热。最好将定义放在它自己的头文件中(使用如上所示的包含保护),然后在必要时包含该文件。

【讨论】:

【参考方案2】:

我会将这个和任何其他共享定义分解到一个 types.h 标头中,该标头包含在您的每个其他标头中。

或者,你可以做类似的事情

#ifndef BOOL_DEFINED
#define BOOL_DEFINED
typedef enum bool 
    false,
    true,
 bool;
#endif

在两个标题中。

【讨论】:

以上是关于无法重新定义枚举 typedef的主要内容,如果未能解决你的问题,请参考以下文章

枚举数/语义问题的重新定义

typedef

Javascript 中无法枚举自定义属性?

无法读取 Typescript Build 中的枚举定义

有没有办法保存 USB 设备,以便在重新插入后可以防止重新枚举?

Xamarin:绑定 ios 协议/委托无法访问 structs.cs 中定义的枚举