我有一个C项目,其结构如下:
Project
- fileA.h
- fileA.c
+ subdirB
- fileD.h
fileD.h中有一个bool的typedef枚举:
typedef enum bool {
false = 0, /**< false (0) */
true /**< true (1) */
} bool;
在fileA.c中有几个函数使用bool作为参数,因此包含了fileD.h:
#include "subdirB/fileD.h" // header with bool typedef
#include "fileA.h" // own header with foo declaration
...
int foo (bool bar) {
...
return 0;
}
...
这些函数将变为全局函数,因此它们的声明将添加到头文件A.h:
中int foo (bool bar);
但最后一点却给我一个错误,“标识符bool未定义”......我不明白为什么会出现这种情况?
答案 0 :(得分:4)
您是否在fileD.h
中加入了fileA.h
?为了声明一个带有bool的函数,编译器需要知道bool是什么。
答案 1 :(得分:1)
如前所述,fileA.h
需要了解bool
中定义的fileD.h
类型,以便foo()
的函数原型有效。
但请注意,由于您的bool
不是内置类型,而是enum
,因此对于所有非零值,没有隐式转换为true
。所以不要指望foo()
中的代码如下:
if (bar == true) {
//...
}
在一般情况下工作。您可以使用foo()
的宏替换来缓解此问题:
#define foo(x) foo(!!(x))
如果您有许多功能需要bool
,这将变得乏味。但!!
技巧本身可以为您将非零值转换为1
。