【问题标题】:error: unknown type name ‘bool’错误:未知类型名称“布尔”
【发布时间】:2011-12-29 07:18:05
【问题描述】:

我下载了源代码,想编译扫描仪的文件。它会产生这个错误:

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

【问题讨论】:

  • #include <stdbool.h>

标签: c gcc lex


【解决方案1】:

C90 不支持布尔数据类型。

C99 确实将它包含在这个包含中:

#include <stdbool.h>

【讨论】:

  • C99 可以,如果你有#include &lt;stdbool.h&gt;
  • C99 有一个原生布尔类型,称为_Bool&lt;stdbool.h&gt; 标头为其提供了一个名为 bool 的 typedef,以及 truefalse
  • 为什么我可以在 OSX 上编译我的 bool 东西而不包括 stdbool.h ?
  • 我也复制粘贴了一些“C”代码,并且回答必须包含 stbool.h 所以 gcc 已编译。然而,似乎 C++ 知道布尔值“开箱即用”,所以我可以简单地使用 g++ 进行编译,而无需对代码进行任何更改。因此,根据您的上下文、代码源和更多错误,您可能不是在看 c,而是看 c++ 代码。
【解决方案2】:

在您的代码中某处有一行#include &lt;string&gt;。这本身就告诉您该程序是用 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

【讨论】:

    【解决方案3】:

    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 编译的外部库可能会导致难以诊断的运行时错误)。

    【讨论】:

    • 我自己最喜欢定义bool的方式是:typedef enum { false, true } bool;
    • 您需要typedef 才能将类型引用为bool 而不是enum bool
    • 后一种方式本质上是有风险的,因为没有隐式转换。例如,如果我们有 16 位整数和long FLAG = 0x4000000; bool b = ( x &amp; FLAG );,那么这会导致未定义的行为(即使x 设置了标志,b 也可能看起来为假)。当bool 是函数参数时,这更难发现。使用,但要小心使用。
    • 当心!这个typedef 不会 在极端情况下的行为与真正的 C99 布尔值相同,因为真正的 C99 布尔值只有两个值,但这个 typedef 支持的值与 int 一样多,还因为 C99 bool 具有 typedef 没有的特殊转换规则。示例:在 C99 中,(bool)99999998430674944 明确为 true。使用你的typedef,在我的机器上用 GCC 编译,(bool)99999998430674944false(由于在转换时如何处理溢出)。
    • @KeithThompson 如果您尝试链接使用普通 bool 编译的外部库,则这样的定义会破坏 ABI。
    【解决方案4】:

    只需添加以下内容:

    #define __USE_C99_MATH
    
    #include <stdbool.h>
    

    【讨论】:

    • 什么是__USE_C99_MATH
    猜你喜欢
    • 2012-02-20
    • 2016-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-12
    • 1970-01-01
    相关资源
    最近更新 更多