2010-08-20 28 views
13

Tôi đã viết một tập hợp các cấu trúc dữ liệu và chức năng trong C, một số trong số đó sử dụng kiểu dữ liệu _Bool. Khi tôi bắt đầu, dự án đã được tinh khiết C. Bây giờ tôi đang điều tra bằng cách sử dụng một bộ công cụ GUI dựa trên C++ và đã làm cho mã phụ trợ vào một thư viện._Bool và bool: Làm thế nào để giải quyết vấn đề của một thư viện C sử dụng _Bool?

Tuy nhiên, khi biên soạn cáC++ GUI C được lỗi sau được phát ra bởi trình biên dịch:

ISO C++ forbids declaration of '_Bool' with no type

ban đầu tôi nghĩ tôi có thể tìm kiếm & thay _Bool-bool và tạo:

/* mybool.h */ 
#ifndef MYBOOL_H 
#define MYBOOL_H 

typedef _Bool bool; 

#endif /* MYBOOL_H */ 

và sau đó trong bất kỳ tiêu đề nào sử dụng _Bool

#ifdef __cplusplus 
extern "C" { 
#else 
#include "mybool.h" 
#endif 

/* rest of header... */ 

Cho đến khi tôi nhận ra điều này sẽ biên dịch thư viện với một kiểu dữ liệu boolean (C _Bool), và liên kết với thư viện bằng cách sử dụng khác (C++ bool). Thực tế, điều này có thể không quan trọng, nhưng về mặt lý thuyết, nó có thể làm (có thể có một số hệ thống mơ hồ ở đâu đó mà làm như vậy làm cho vũ trụ quay vào trong).

Tôi giả sử tôi chỉ có thể sử dụng một int và sử dụng 0 cho sai và 1 cho đúng, và typedef nó với một cái gì đó như typedef int mybool, nhưng nó có vẻ không hấp dẫn.

Có cách nào tốt hơn/thành ngữ/tiêu chuẩn để thực hiện việc này không?

+1

Đặt câu trả lời đó thành câu trả lời, 'bool' là cách' _Bool' có ý định sử dụng bình thường. –

+1

Vì vậy, tôi không cần phải lo lắng về vũ trụ quay vào trong? –

Trả lời

5

Dumbass! Chỉ cần #include <stdbool.h> và sử dụng bool.

+5

câm ass: (tính từ) cực kỳ không thông minh. (Hyphenated. Xem "ass"). Bạn có nghĩa là ngược lại bạn cực kỳ thông minh hơn vì bạn biết rằng một người nên bao gồm #include để sử dụng bool in C. Tôi không dám nói những gì tôi nghĩ về câu trả lời của bạn. –

+9

Tại sao có, trái ngược với tự ngu ngốc của tôi, tất nhiên tôi thông minh hơn. –

+0

Chấp nhận câu trả lời của riêng tôi và quyết định của tôi để gọi bản thân mình là một thằng ngốc (vì không nhận ra câu trả lời ** trước ** hỏi câu hỏi trên stackoverflow.com). –

-4

sử dụng typedef int _Bool cho cả mã C và C++ của bạn. Tôi sẽ ngạc nhiên nếu _Bool được định nghĩa là bất cứ điều gì khác.

+8

_Bool là kiểu gốc C99. –

+0

Vì vậy, bạn không thể. –

+1

@JamesMorris: Không chỉ là kiểu gốc, tên của nó là một từ khóa (giả sử trình biên dịch C hỗ trợ C99 hoặc mới hơn). –

11

Nếu trình biên dịch C và C++ bạn đang sử dụng đến từ cùng một nhà cung cấp thì tôi mong đợi C _Bool là cùng loại với C++ bool, và bao gồm <stdbool.h> sẽ làm mọi thứ có thể tương thích tốt. Nếu họ đến từ các nhà cung cấp khác nhau thì bạn sẽ cần phải kiểm tra tính tương thích.

Lưu ý, bạn luôn có thể thử nghiệm macro __cplusplus trong tiêu đề của mình để xác định xem mã có đang được biên dịch dưới dạng C++ hay không và đặt loại phù hợp.

+0

Tôi luôn có thể kiểm tra macro __cplusplus trong tiêu đề ... Mmmm yeah, cũng được phát hiện. –

+0

http://stackoverflow.com/questions/25461/interfacing-with-stdbool-hc là một ví dụ về trường hợp chúng không tương thích, mặc dù vấn đề có một 'stdbool.h' không được trình biên dịch không cung cấp tiêu đề. –

1

Tôi nghĩ rằng người dùng phải sử dụng bool trong bất kỳ dự án nào, để có khả năng tương thích với C++, nếu cần thiết.

Kiểu dữ liệu _Bool trong C99 tồn tại để tránh xung đột với các phiên bản có thể tồn tại của bool mà các lập trình viên có thể đã được xác định trước chuẩn C99. Do đó, lập trình viên có thể chọn cách tốt hơn để thích ứng với các chương trình C cũ của họ để di chuyển theo hướng mới. Vì vậy, tôi nghĩ rằng để sử dụng từ bool là mong muốn thực sự của Commitee standarization C99, nhưng nó đã bị buộc phải bao quanh các vấn đề không tương thích bằng cách xác định từ xấu xí _Bool. Điều này cho thấy lập trình viên có thể phải sử dụng từ "dự định" bool trong các dự án của mình. Đây là từ hợp lý nhất để khai báo một kiểu boolean boolean trong một chương trình.

Trong một số trường hợp, bạn có thể giữ định nghĩa lập trình không đồng nhất của bool và trong các trường hợp khác, tốt hơn nên sử dụng phiên bản bool được xác định trong <stdbool.h>. Người lập trình phải quyết định điều gì là tốt hơn trong mỗi trường hợp và bên cạnh đó, có thể, để xem xét nếu di chuyển dần dần sang <stdbool.h> là một hành động tốt để thực hiện.

Nếu bạn đang bắt đầu dự án từ 0, thì có lẽ cách tiếp cận tốt nhất là sử dụng bool được xác định trong <stdbool.h>.

3

Chính thức, không có giải pháp cho vấn đề này. Loại _Bool chỉ tồn tại trong ngôn ngữ C. C++ không cung cấp bất kỳ loại nào đảm bảo khả năng tương thích nhị phân với _Bool. C++ bool không đảm bảo tương thích.

Giải pháp thích hợp không được sử dụng bool hoặc _Bool trong khai báo tham số của hàm C có thể truy cập trực tiếp (tức là có thể liên kết) từ mã C++. Sử dụng int, char hoặc bất kỳ loại nào khác được đảm bảo tương thích.

+2

Tôi nghi ngờ rằng 'int' hoặc' char' _guaranteed_ tương thích giữa C và C++. Nó có thể được tuyên bố là đúng trong tài liệu cho trình biên dịch, nhưng nói chung xác nhận này là sai. Và nếu tài liệu tuyên bố tương thích 'int' tôi không thấy lý do tại sao nó không nên nói như vậy về 'bool'. – magras

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