2012-05-17 18 views
9

'da tanımlanmış olup olmadığını kontrol edin Bu nedenle, devraldığım bazı kodlarla ilgili sorunlar yaşıyorum. Bu kod C-ortamında yalnızca iyi çalışıyordu, ancak şimdi bu kodu çağırmak için C++ kullanmam gerekiyor. başlık problem.h içerir:Boole, karışık C/C++

#ifndef _BOOL 
typedef unsigned char bool; 
static const bool False = 0; 
static const bool True = 1; 
#endif 

struct astruct 
{ 
    bool myvar; 
    /* and a bunch more */ 
} 

C++ kodu olarak, ben anlamıyorum extern "C" { ... } içinde #include "problem.h" (wrap eğer

error C2632: 'char' followed by 'bool' is illegal ben çünkü orada olmalı, aynı hatayı alıyorum olsun bunu derlerken ? C derlerken #ifndef _BOOL den #endif için blok kaldırma ve C++ olarak derleme çalıştı

) hiçbir anahtar kelime bool olacak ve ben hataları alıyorum:

error C2061: C requires that a struct or union has at least one member
error C2061: syntax error: identifier 'bool'

ben yeniden tanımlanmasını çıkarıp sadece değişkenleri tanımlamak için bool kullanmaya çalışırken ben sadece bir şey bulamazsa, C++ derleyicisi bool yeniden tanımlanması hakkında şikayet nasıl çalıştığını anlamak, henüz yok .

Her türlü yardım büyük beğeni topluyor.

+2

Not. "C bağlantısı ile derleme" anlamına gelir. İçindeki kod hala C++, sadece C olarak bağlanamayan hiçbir şeyi tanımlamaya izin verilmiyor. –

cevap

15

bool, C++ (ancak C cinsinden değil) türünde temel bir türüdür ve yeniden tanımlanamaz.

Sen

#ifndef __cplusplus 
typedef unsigned char bool; 
static const bool False = 0; 
static const bool True = 1; 
#endif 
+0

Damnit, beni dövüyorsun :) –

+1

Fakat bu kod C99'un stdbool.h ile de uyumlu değil. dikkat! –

+0

Halen 'char bunu takiben yasadışı' hakkında şikayet ediyor, bu yüzden '_cplusplus' tanımlamıyor demektir? – prelic

5

kullanabilirsiniz kodunuzu çevreleyen olabilir C99 en bool:

#ifndef __cplusplus 
#include <stdbool.h> 
#endif 

bool myBoolean; // bool is declared as either C99's _Bool, or C++'s bool data type. 

bunu neden kullanmalısınız?

Diğer C99 kodlarıyla uyumluluk için. _Bool, C99 Kodunda yaygın olarak kullanılmaktadır ve çok kullanışlıdır. Ayrıca, pek çok şeyi yazmanıza gerek kalmadan bir boole veri türüne sahip olmanıza da imkan verir, çünkü sahnelerin arkasında, _Bool derleyici tarafından tanımlanmış bir veri türüdür.

+0

Hiçbir şey hafızada hiçbir şey almaz. Bayt yazmayı mı kastediyorsun? –

+0

@LuchianGrigore nope, biraz kastettim. Bit alanlarına bakın, bir yapıda olduğunda, boole benzer şekilde paketlenir. –

+0

Standart, char boyutundan başka hiçbir boyutta olmadığını söylüyor. Geri kalan uygulama tanımlanmıştır. Bir bool depolamak için 1Mb kullanan standart uyumlu derleyiciler bulunabilir. –

1

Sen __cplusplus makro kullanmalısınız:

#ifndef __cplusplus 
#ifndef _BOOL 
typedef unsigned char bool; 
static const bool False = 0; 
static const bool True = 1; 
#endif 
#endif 

kontrol dışarı daha detaylı bilgi için bu link to the C++ FAQ.

-3

Bu "'char' ve ardından 'bool', yasadışı" sorun da vardı. Benim için sorun, ben bir yarı-kolon ile benim sınıf beyannamesi sona ermedim oldu - ben bu başlık dosyasında olduğu gibi sorun olmayı beklemiyordum ve sorun cpp dosyasında geliyordu! örn: `extern "C"` "C derlemek" anlamına gelmediğini

class myClass 
{ 

}; // <-- put the semi colon !! 
+2

Bu, 'bool' ile ilgili soru nedir? –

+0

Ben de VS hata "VS hata" sonra 'bool' sonra yasadışı "sorununda yayınlanan oldu - benim için düzeltme sadece sınıf bildiriminin sonunda yarı kolon eklemek oldu. –

+0

@JustinHirsch Visual Studio bir programlama dili değil, bir IDE'dir. – cybermonkey