lỗi: tên loại không xác định 'bool'


86

Tôi đã tải xuống mã nguồn và muốn biên dịch tệp của máy quét. Nó tạo ra lỗi này:

[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.

Và tôi đã cố gắng sử dụng trình biên dịch khác để biên dịch nó, nhưng nó xuất hiện các lỗi khác nhau.

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

Hệ điều hành của tôi là 3.0-ARCH, tôi không biết tại sao điều này lại xảy ra. Làm cách nào để sửa lỗi?


12
#include <stdbool.h>
leppie

Câu trả lời:


146

C90 không hỗ trợ kiểu dữ liệu boolean.

C99 không bao gồm nó với điều này bao gồm:

#include <stdbool.h>

48
C99 không, nếu bạn có #include <stdbool.h>.
Keith Thompson

1
C99 có một kiểu boolean gốc được gọi là _Bool. Các <stdbool.h>tiêu đề cung cấp một typedef cho nó được gọi là bool, cùng với truefalse.
MM

1
Tại sao tôi có thể biên dịch nội dung bool của mình tốt trên OSX mà không bao gồm stdbool.h?
David 天宇 Wong

Tôi cũng đã sao chép và dán một số mã "C" và như được trả lời phải bao gồm stbool.h để gccđược biên dịch. Tuy nhiên, có vẻ như C ++ biết booleans "ra khỏi hộp" vì vậy tôi có thể chỉ cần sử dụng g++để biên dịch mà không có bất kỳ thay đổi nào đối với mã. Vì vậy, tùy thuộc vào ngữ cảnh, nguồn mã của bạn và các lỗi khác có thể bạn không nhìn vào mã c mà là mã c ++.
nuala

55

C99 không, nếu bạn có

#include <stdbool.h> 

Nếu trình biên dịch không hỗ trợ C99, bạn có thể tự định nghĩa nó:

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

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

#endif

(nhưng lưu ý rằng định nghĩa này thay đổi ABI cho boolloại, do đó liên kết với các thư viện bên ngoài được biên dịch với định nghĩa đúng boolcó thể gây ra lỗi thời gian chạy khó chẩn đoán).


39
Cách yêu thích của riêng tôi để xác định boollà:typedef enum { false, true } bool;
Keith Thompson

2
Bạn cần typedefcó thể tham chiếu đến loại boolthay vì enum bool.
Keith Thompson,

3
Cách sau vốn có rủi ro vì không có chuyển đổi ngầm định. Ví dụ: nếu chúng ta có các int 16 bit và long FLAG = 0x4000000; bool b = ( x & FLAG );sau đó điều này gây ra hành vi không xác định (với kết quả có khả năng bsẽ là sai ngay cả khi xđã đặt cờ). Điều này khó phát hiện hơn khi boollà một tham số hàm. Sử dụng, nhưng sử dụng cẩn thận.
MM

6
Hãy coi chừng! Điều này typedef sẽ không hoạt động giống như bool C99 thực sự trong các trường hợp cạnh, cả hai vì bool C99 thực chỉ có hai giá trị nhưng điều này typedefhỗ trợ nhiều như intvậy, nhưng cũng vì C99 boolcó các quy tắc truyền đặc biệt mà typedefkhông có. Ví dụ: trong C99, (bool)99999998430674944là rõ ràng true. Với của bạn typedef, biên dịch trong GCC trên máy của tôi, (bool)99999998430674944false(do cách xử lý tràn khi truyền).
Mark Amery

1
@KeithThompson Định nghĩa như thế này phá vỡ ABI nếu bạn cố gắng liên kết với thư viện bên ngoài được biên dịch bằng bool bình thường.
yugr


4

Ở đâu đó trong mã của bạn có một dòng #include <string>. Điều này tự nó cho bạn biết rằng chương trình được viết bằng C ++. Vì vậy, sử dụng g++là tốt hơn gcc.

Đối với thư viện bị thiếu: bạn nên tìm kiếm xung quanh hệ thống tệp nếu bạn có thể tìm thấy tệp được gọi libl.so. Sử dụng các locatelệnh, cố gắng /usr/lib, /usr/local/lib, /opt/flex/lib, hoặc sử dụng brute-force find / | grep /libl.

Khi bạn đã tìm thấy tệp, bạn phải thêm thư mục vào dòng lệnh của trình biên dịch, ví dụ:

g++ -o scan lex.yy.c -L/opt/flex/lib -ll
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.