我有 bool typedef 的代码
typedef enum bool {
false,
true,
} bool;
在两个头文件中,如果最终父头文件中不包含它,则子 C 文件当然不能使用 bool 类型,尽管也定义了它的较小头文件的子文件可以。
但是,如果我在最终的父头文件中定义它,那么较小的头文件定义错误“布尔已在当前范围内声明”
我需要一个较小标题的解决方案,它可能包含在可能已经或可能尚未定义 bool 的项目中......最好的方法是什么?
塔
我有 bool typedef 的代码
typedef enum bool {
false,
true,
} bool;
在两个头文件中,如果最终父头文件中不包含它,则子 C 文件当然不能使用 bool 类型,尽管也定义了它的较小头文件的子文件可以。
但是,如果我在最终的父头文件中定义它,那么较小的头文件定义错误“布尔已在当前范围内声明”
我需要一个较小标题的解决方案,它可能包含在可能已经或可能尚未定义 bool 的项目中......最好的方法是什么?
塔
首先,如果您使用的是 C99 或更高版本的编译器,那么stdbool.h
.
其次,您通常可以避免直接针对true
和false
值进行测试,多年来我发现这实际上导致代码更易于阅读且不易出错(不过,这只是个人意见——YMMV)。
直接的解决方案是用包含保护包围你的 typedef:
#ifndef BOOL_DEFINED
#define BOOL_DEFINED
typedef enum bool {
false,
true
} bool;
#endif
这将防止该类型被多次声明。但是,正如您所发现的,将相同的类型定义放在两个不同的标头中会导致胃灼热。最好将定义放在它自己的头文件中(使用如上所示的包含保护),然后在必要时包含该文件。
我会将这个和任何其他共享定义分解到一个 types.h 标头中,该标头包含在您的每个其他标头中。
或者,你可以做类似的事情
#ifndef BOOL_DEFINED
#define BOOL_DEFINED
typedef enum bool {
false,
true,
} bool;
#endif
在两个标题中。