错误:未知类型名称“ bool”


86

我下载了源代码,并希望编译扫描程序的文件。它产生此错误:

[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,我不知道为什么会这样。如何解决错误?


12
#include <stdbool.h>
leppie

Answers:


146

C90不支持布尔数据类型。

C99包括以下内容:

#include <stdbool.h>

48
如果有,C99可以#include <stdbool.h>
基思·汤普森

1
C99具有称为的本地布尔类型_Bool。该<stdbool.h>头提供一个typedef它叫bool,随着truefalse
MM

1
我怎么能在不包含stdbool.h的情况下在OSX上很好地编译布尔值?
大卫·天宇·黄

我也已经复制粘贴了一些“ C”代码,并且必须包含这样gcc编译的stbool.h 。但是,似乎C ++知道布尔值是“开箱即用”的,所以我可以简单地g++用于编译而无需对代码进行任何更改。因此,取决于您的上下文,代码源和其他错误,您可能不是在看c,而是在看c ++代码。
nuala

55

如果有,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

(但是请注意,此定义会更改ABIbool类型,因此,使用正确定义的外部库进行链接bool可能会导致难以诊断的运行时错误)。


39
我自己最喜欢的定义方式bool是:typedef enum { false, true } bool;
Keith Thompson

2
您需要typedef能够将类型引用为,bool而不是enum bool
基思·汤普森

3
由于没有隐式转换,后一种方法具有固有的风险。例如,如果我们有16位整数,long FLAG = 0x4000000; bool b = ( x & FLAG );那么这将导致未定义的行为(b即使x设置了标志,其结果也可能为假)。当bool是函数参数时,这很难发现。使用,但要小心使用。
MM

6
谨防!这typedef 会不会表现得一样在边缘情况下,真正的C99布尔,一方面是因为真正的C99布尔只有两个值,但这种typedef支持多达int做,也是因为C99bool具有特殊的铸造规则,在typedef没有。例子:在C99中,(bool)99999998430674944true。使用typedef,在我的计算机上的GCC中进行编译(bool)99999998430674944false(由于强制转换时如何处理溢出)。
Mark Amery

1
@KeithThompson如果您尝试链接使用普通bool编译的外部库,则这样的定义会破坏ABI。
yugr


4

在代码中的某处有一行#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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.