2012-05-17 35 views
9

Vì vậy, tôi đang gặp sự cố với một số mã mà tôi đã kế thừa. Mã này đã được xây dựng tốt trong một môi trường C-only, nhưng bây giờ tôi cần phải sử dụng C + + để gọi mã này. Tiêu đề problem.h chứa:Kiểm tra xem bool có được định nghĩa trong hỗn hợp 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 */ 
} 

Khi tôi biên dịch nó như C++, tôi nhận được error C2632: 'char' followed by 'bool' is illegal

tôi nhận được lỗi tương tự nếu tôi quấn #include "problem.h" trong extern "C" { ... } (mà tôi không hiểu, bởi vì có nên không có từ khóa bool khi biên dịch như C)

tôi đã cố gắng loại bỏ các khối từ #ifndef _BOOL để #endif, và biên dịch như C++, và tôi nhận được lỗi:?

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

Tôi chỉ không hiểu làm thế nào ++ biên dịch C được phàn nàn về việc xác định lại bool, nhưng khi tôi loại bỏ các định nghĩa lại và cố gắng chỉ sử dụng bool để xác định các biến, nó không tìm thấy bất cứ điều gì .

Bất kỳ trợ giúp nào được đánh giá cao.

+2

Lưu ý rằng 'extern" C "' không có nghĩa là "biên dịch thành C". Nó có nghĩa là "biên dịch với liên kết C". Mã bên trong vẫn là C++, bạn không được phép định nghĩa bất cứ thứ gì không thể liên kết với tên C. –

Trả lời

15

bool là kiểu cơ bản trong C++ (nhưng không phải trong C) và không thể xác định lại.

Bạn có thể đặt mã của bạn với

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

Chết tiệt, bạn đánh tôi với nó :) –

+1

Nhưng mã đó cũng không tương thích với 'stdbool.h' của C99, hãy cẩn thận! –

+0

Nó vẫn còn phàn nàn về 'char theo sau bởi bool là bất hợp pháp', do đó, điều đó có nghĩa là nó không đọc' _cplusplus' xác định? – prelic

5

Bạn có thể sử dụng C99 của bool:

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

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

Tại sao bạn nên sử dụng điều này?

Để tương thích với mã C99 khác. _Bool thường được sử dụng trong Mã C99 và rất hữu ích. Nó cũng cấp cho bạn khả năng có một kiểu dữ liệu boolean mà không cần phải gõ nhiều thứ, như đằng sau hậu trường, _Bool là một kiểu dữ liệu được trình biên dịch xác định.

+0

Không có gì mất một chút trong bộ nhớ. Ý bạn là viết byte? –

+0

@LuchianGrigore nope, tôi có nghĩa là bit. Nhìn vào các trường bit, khi trong một cấu trúc, các bool được đóng gói theo cách tương tự. –

+0

Tiêu chuẩn nói không có gì về kích thước, khác với kích thước của char. Phần còn lại được thực hiện xác định. Có thể tồn tại các trình biên dịch tuân thủ tiêu chuẩn sử dụng 1Mb để lưu trữ một bool. –

1

Bạn nên sử dụng __cplusplus vĩ mô:

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

Check-out link to the C++ FAQ này để biết thêm chi tiết.

-3

Tôi đã có "'char' này theo sau là 'bool' là bất hợp pháp" vấn đề trong VS cũng. Vấn đề đối với tôi là tôi đã không kết thúc tuyên bố lớp học của tôi với một dấu chấm phẩy mà tôi không ngờ là vấn đề này nằm trong tệp tiêu đề và vấn đề đang xảy ra trong tệp cpp! ví dụ:

class myClass 
{ 

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

Làm thế nào mà liên quan đến 'bool' như câu hỏi? –

+0

tôi cũng nhận được lỗi VS đã được đăng trong câu hỏi "'char' theo sau là 'bool' là bất hợp pháp" trong VS - sửa chữa cho tôi chỉ để thêm dấu chấm phẩy ở cuối khai báo lớp. –

+0

@JustinHirsch Visual Studio là một IDE, không phải là ngôn ngữ lập trình. – cybermonkey

Các vấn đề liên quan