hata: bilinmeyen tür adı 'bool'


88

Kaynak kodunu indirdim ve tarayıcının dosyasını derlemek istedim. Bu hatayı üretir:

Ve onu derlemek için farklı bir complier kullanmayı denedim, ancak farklı hatalar ortaya çıktı.

İşletim sistemim 3.0-ARCH, bunun neden olduğunu bilmiyorum. Hatayı nasıl düzeltirim?


12
#include <stdbool.h>
leppie

Yanıtlar:


151

C90, boolean veri türünü desteklemez.

C99, aşağıdakileri içerir:


48
Eğer varsa C99 var #include <stdbool.h>.
Keith Thompson

1
C99, adında yerel bir boole türüne sahiptir _Bool. <stdbool.h>Başlık denilen bir typedef sağlar boolile birlikte, trueve false.
MM

1
nasıl oluyor da bool şeylerimi stdbool.h eklemeden OSX üzerinde derleyebiliyorum?
David 天宇 Wong

Ben de bazı "C" kodunu kopyalayıp yapıştırdım ve yanıt olarak stbool.h'yi bu şekilde derlemek zorunda kaldım gcc. Bununla birlikte, C ++ booleanları "kutunun dışında" biliyor gibi görünüyor, bu yüzden g++kodda herhangi bir değişiklik yapmadan derleme için kullanabilirim . Dolayısıyla bağlamınıza, kod kaynağına ve diğer hatalara bağlı olarak belki c değil c ++ koduna bakıyorsunuzdur.
nuala

55

Eğer varsa C99 yapar

Derleyici C99'u desteklemiyorsa, kendiniz tanımlayabilirsiniz:

(ancak bu tanımın tür için ABI'yi değiştirdiğini unutmayın; bu boolnedenle, uygun şekilde tanımlanmış olarak derlenmiş harici kitaplıklara bağlanmak bool, teşhis edilmesi zor çalışma zamanı hatalarına neden olabilir).


39
Tanımlamanın en sevdiğim yolu bool:typedef enum { false, true } bool;
Keith Thompson

2
İhtiyacınız typedefolarak türünü belirtir muktedir boolziyade enum bool.
Keith Thompson

3
İkinci yol doğası gereği risklidir çünkü örtük bir dönüştürme yoktur. Örneğin, 16 bitlik girişlere sahip olsaydık ve long FLAG = 0x4000000; bool b = ( x & FLAG );bu, tanımsız davranışa neden bolursa x(bayrak ayarlanmış olsa bile muhtemelen yanlış olarak görünecek olan sonuçla ). boolBir işlev parametresi olduğunda bunu fark etmek daha zordur . Kullanın, ancak dikkatli kullanın.
MM

6
Dikkat! Bu typedef , uç durumlarda gerçek bir C99 boolü ile aynı şekilde davranmaz, çünkü hem gerçek bir C99 bool'u sadece iki değere sahiptir, ancak bu typedef, olduğu kadar çoğunu destekler int, hem de C99'un boolsahip olmadığı özel döküm kuralları vardır typedef. Örnek: C99'da, (bool)99999998430674944açık bir şekilde true. Senin ile typedefbenim makinede GCC derleme, (bool)99999998430674944olduğu false(dolayı yayın yaparken taşma nasıl işlendiğini kadar).
Mark Amery

1
@KeithThompson Normal bool ile derlenmiş harici kitaplığa bağlanmaya çalışırsanız, bu gibi tanımlama ABI'yi bozar.
yugr


4

Kodunuzun bir yerinde bir satır var #include <string>. Bu tek başına programın C ++ ile yazıldığını söyler. Yani kullanmak g++daha iyidir gcc.

Eksik kitaplık için: adında bir dosya bulabilirseniz, dosya sistemine bakmalısınız libl.so. Kullanın locatedeneyin komutu /usr/lib, /usr/local/lib, /opt/flex/libveya kaba kuvvet kullanmak find / | grep /libl.

Dosyayı bulduğunuzda, dizini derleyici komut satırına eklemeniz gerekir, örneğin:

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.