错误:未知类型名称'bool'。

129
我下载了源代码并想编译扫描器文件。它报错如下:
[meepo@localhost cs143-pp1]$ gcc -o lex.yy.o lex.yy.c -ll
In file included from scanner.l:15:0:
scanner.h:59:5: error: unknown type name ‘bool’
In file included from scanner.l:16:0:
utility.h:64:38: error: unknown type name ‘bool’
utility.h:74:1: error: unknown type name ‘bool’
In file included from scanner.l:17:0:
errors.h:16:18: fatal error: string: No such file or directory
compilation terminated.

我尝试使用不同的编译器进行编译,但出现了不同的错误。

[meepo@localhost cs143-pp1]$ g++ -o scan lex.yy.c -ll
/usr/bin/ld: cannot find -ll
collect2: ld returned 1 exit status

我的操作系统是3.0-ARCH,我不知道为什么会出现这个错误。如何修复这个错误?


17
包含头文件stdbool.h。 - leppie
4个回答

234

C90不支持布尔数据类型。

C99包含以下内容:

#include <stdbool.h>

56
如果你包含了 #include <stdbool.h>,那么 C99 就支持布尔类型。 - Keith Thompson
2
C99有一个本地布尔类型叫做“_Bool”。头文件<stdbool.h>为其提供了一个名为“bool”的typedef,以及truefalse - M.M
1
为什么我在OSX上编译我的bool代码时不需要包含stdbool.h头文件就可以顺利通过? - David 天宇 Wong
我复制粘贴了一些"C"代码,如答案所述,必须包括stbool.h,以便gcc编译。然而,C++似乎可以直接使用布尔值,因此我可以简单地使用g++进行编译,而不需要对代码进行任何更改。因此,根据您的上下文、代码来源和其他错误,您可能正在查看C++代码,而不是C代码。 - nuala

67

C99支持该特性,如果你有

#include <stdbool.h> 

如果编译器不支持C99,你可以自己定义它:

// file : myboolean.h
#ifndef MYBOOLEAN_H
#define MYBOOLEAN_H

#define false 0
#define true 1
typedef int bool; // or #define bool int

#endif

(但需要注意的是,这个定义会改变ABI中的bool类型,所以链接到使用正确定义bool编译的外部库可能会导致难以诊断的运行时错误。)


42
我个人最喜欢的定义“bool”的方式是:typedef enum { false, true } bool; - Keith Thompson
3
你需要使用 typedef 来引用类型为 bool 而不是 enum bool - Keith Thompson
4
后一种方法因为没有隐式转换而存在固有的风险。例如,如果我们有16位整数和 long FLAG = 0x4000000; bool b = (x & FLAG);,那么这会导致未定义行为(可能会导致 b 看起来是 false,即使 x 已设置标志)。当 bool 是函数参数时,这更难以发现。请谨慎使用此方法。 - M.M
7
注意!这个 typedef 在边缘情况下与真正的 C99 布尔型不会表现相同,原因是真正的 C99 布尔型只有两个值,但这个 typedef 支持和 int 一样多的值;此外,C99 的 bool 有特殊的转换规则,而该 typedef 没有。例如:在 C99 中,(bool)99999998430674944 明确为 true。使用你的 typedef 在我的机器上编译时,(bool)99999998430674944false(因为转换时溢出的处理方式不同)。 - Mark Amery
1
如果您尝试与使用普通bool编译的外部库链接,则此类定义会破坏ABI。 - yugr
显示剩余10条评论

6
只需添加以下内容:
#define __USE_C99_MATH

#include <stdbool.h>

7
__USE_C99_MATH 是一个宏定义,用于启用 C99 标准中的数学函数库。 - Keith Thompson

5
在你的代码中,有一行 #include <string>。这就告诉你程序是用C++编写的。所以使用g++gcc更好。
对于缺失的库:你应该在文件系统中查找一个名为libl.so的文件。使用locate命令,尝试/usr/lib/usr/local/lib/opt/flex/lib,或者使用暴力搜索命令find / | grep /libl
一旦你找到了文件,就必须将目录添加到编译器命令行中,例如:
g++ -o scan lex.yy.c -L/opt/flex/lib -ll

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接