오류 : 알 수없는 유형 이름 'bool'


88

소스 코드를 다운로드하고 스캐너 파일을 컴파일하고 싶었습니다. 다음 오류가 발생합니다.

그리고 다른 컴파일러를 사용하여 컴파일하려고했지만 다른 오류가 나타났습니다.

내 OS는 3.0-ARCH인데 왜 이런 일이 발생했는지 모르겠습니다. 오류를 어떻게 수정합니까?


12
#include <stdbool.h>
leppie 2011

답변:


152

C90은 부울 데이터 유형을 지원하지 않습니다.

C99에는 다음이 포함됩니다.


48
C99는 #include <stdbool.h>.
Keith Thompson

1
C99에는라는 기본 부울 유형이 _Bool있습니다. <stdbool.h>헤더는 호출에 대한 형식 정의를 제공 bool과 함께, truefalse.
MM

1
stdbool.h를 포함하지 않고 OSX에서 어떻게 bool을 잘 컴파일 할 수 있습니까?
David 天宇 Wong

일부 "C"코드를 복사하여 붙여 넣었고 응답 한대로 stbool.h를 gcc컴파일해야했습니다. 그러나 C ++는 "즉시"부울을 알고 있으므로 g++코드를 변경하지 않고 컴파일에 사용할 수 있습니다. 따라서 컨텍스트, 코드 소스 및 추가 오류에 따라 c가 아닌 C ++ 코드를보고있을 수 있습니다.
nuala

55

C99는 있습니다.

컴파일러가 C99를 지원하지 않는 경우 직접 정의 할 수 있습니다.

(그러나이 정의 는 유형에 대한 ABI 를 변경 bool하므로 올바르게 정의 된 상태로 컴파일 된 외부 라이브러리에 대한 링크는 bool진단하기 어려운 런타임 오류를 유발할 수 있습니다.)


39
내가 가장 좋아하는 정의 방법은 다음 bool과 같습니다.typedef enum { false, true } bool;
Keith Thompson

2
당신은 필요 typedef로 형식을 참조 할 수 있도록 bool보다는 enum bool.
Keith Thompson

3
후자의 방법은 암시 적 변환이 없기 때문에 본질적으로 위험합니다. 예를 들어 16 비트 int가 있고 long FLAG = 0x4000000; bool b = ( x & FLAG );정의되지 않은 동작이 발생하는 b경우 ( x플래그가 설정 되어 있어도 false로 나타날 가능성이있는 결과 ). 이 bool함수 매개 변수 인 경우이를 발견하기가 더 어렵습니다 . 사용하되주의해서 사용하십시오.
MM

6
조심하세요! 이것은 엣지 케이스에서 진정한 C99 bool과 동일하게 작동 typedef 하지 않을 것입니다. 왜냐하면 진정한 C99 bool은 단지 두 개의 값을 가지지 만 이것은 typedef많은 것을 지원 int하기 때문입니다. 또한 C99 booltypedef그렇지 않은 특별한 캐스팅 규칙을 가지고 있기 때문 입니다. 예 : C99에서는 (bool)99999998430674944모호하지 않습니다 true. 당신과 함께 typedef, 내 컴퓨터에서 GCC의 컴파일 (bool)99999998430674944입니다 false(때문에 캐스팅 할 때 오버 플로우 처리하는 방법으로).
Mark Amery

1
@KeithThompson 이와 같은 정의는 정상적인 bool로 컴파일 된 외부 라이브러리와 연결하려고하면 ABI를 중단합니다.
yugr


4

코드 어딘가에 한 줄이 #include <string>있습니다. 이것은 그 자체로 프로그램이 C ++로 작성되었음을 알려줍니다. 따라서 사용하는 g++것이 gcc.

누락 된 라이브러리의 경우 : 파일 시스템에서 libl.so. locate명령을 사용 하거나 try /usr/lib,, /usr/local/lib/opt/flex/lib사용하거나 brute-force를 사용하십시오 find / | grep /libl.

파일을 찾으면 컴파일러 명령 줄에 디렉토리를 추가해야합니다. 예를 들면 다음과 같습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.