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

Mee*_*epo 69 c gcc lex

我下载了源代码并想编译扫描程序文件.它会产生以下错误:

[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.
Run Code Online (Sandbox Code Playgroud)

我尝试使用不同的编译器来编译它,但它出现了不同的错误.

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

我的操作系统是3.0-ARCH,我不知道为什么会这样.我该如何修复错误?

use*_*122 120

C90不支持布尔数据类型.

C99确实包括它包括:

#include <stdbool.h>
Run Code Online (Sandbox Code Playgroud)

  • 如果你有`#include <stdbool.h>`,C99会这样做. (46认同)
  • C99 有一个名为“_Bool”的原生布尔类型。“&lt;stdbool.h&gt;”标头为其提供了一个名为“bool”的类型定义,以及“true”和“false”。 (2认同)

小智 51

如果你有,C99会这样做

#include <stdbool.h> 
Run Code Online (Sandbox Code Playgroud)

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

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

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

#endif
Run Code Online (Sandbox Code Playgroud)

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

  • 我自己喜欢定义`bool`的方法是:`typedef enum {false,true} bool;` (38认同)
  • 谨防!这种`typedef`*在边缘情况下的行为不会与真正的C99 bool相同,因为真正的C99 bool只有两个值,但这个`typedef`支持的数量与`int`一样多,但也因为C99` bool`有特殊的铸造规则,`typedef`没有.例如:在C99中,`(bool)99999998430674944`明确地为'true`.使用你的`typedef`,在我的机器上用GCC编译,`(bool)99999998430674944`是'false`(由于在编译时如何处理溢出). (6认同)
  • 后一种方式具有内在的风险,因为没有隐式转换.例如,如果我们有16位整数和'长FLAG = 0x4000000; bool b =(x&FLAG);`然后这会导致未定义的行为(即使`x`设置了标志,也可能导致`b`看起来是假的).当`bool`是一个函数参数时,这很难发现.使用,但要小心使用. (3认同)
  • 你需要`typedef`才能将类型称为`bool`而不是`enum bool`. (2认同)

M.H*_*fny 6

只需添加以下内容:

#define __USE_C99_MATH

#include <stdbool.h>
Run Code Online (Sandbox Code Playgroud)

  • 什么是“__USE_C99_MATH”? (3认同)

Rol*_*lig 5

在您的代码中的某处有一行#include <string>。这本身就告诉您程序是用 C++ 编写的。所以使用g++gcc.

对于丢失的库:如果你能找到一个名为libl.so. 使用locate命令 try /usr/lib/usr/local/lib/opt/flex/lib或使用 brute-force find / | grep /libl

找到文件后,必须将目录添加到编译器命令行,例如:

g++ -o scan lex.yy.c -L/opt/flex/lib -ll
Run Code Online (Sandbox Code Playgroud)