2008-08-24 26 views
13

Trong một dự án tôi đang giao tiếp giữa C++ và một thư viện C sử dụng stdbool.h được định nghĩa như vậy.interfacing với stdbool.h C++

#ifndef _STDBOOL_H 
#define _STDBOOL_H 

/* C99 Boolean types for compilers without C99 support */ 
/* http://www.opengroup.org/onlinepubs/009695399/basedefs/stdbool.h.html */ 
#if !defined(__cplusplus) 

#if !defined(__GNUC__) 
/* _Bool builtin type is included in GCC */ 
typedef enum { _Bool_must_promote_to_int = -1, false = 0, true = 1 } _Bool; 
#endif 

#define bool _Bool 
#define true 1 
#define false 0 
#define __bool_true_false_are_defined 1 

#endif 

#endif 

Một số cấu trúc có bool thành viên. Vì vậy, nếu tôi có một trong những cấu trúc được định nghĩa là biến cục bộ trong hàm C++ và chuyển nó vào hàm C, các kích thước không nhất quán giữa C++ và C là bool là một bye trong C++ và 4 trong C.

Có ai có bất kỳ lời khuyên để làm thế nào để khắc phục điều này mà không cần đến giải pháp hiện tại của tôi mà là

//#define bool _Bool 
#define bool unsigned char 

đó là so với tiêu chuẩn C99 cho stdbool.h

Trả lời

10

Tôi tìm thấy câu trả lời cho câu hỏi của riêng tôi bằng cách tìm một việc thực hiện tương thích hơn của stdbool.h đó là phù hợp với các tiêu chuẩn C99.

#ifndef _STDBOOL_H 
#define _STDBOOL_H 

#include <stdint.h> 

/* C99 Boolean types for compilers without C99 support */ 
/* http://www.opengroup.org/onlinepubs/009695399/basedefs/stdbool.h.html */ 
#if !defined(__cplusplus) 

#if !defined(__GNUC__) 
/* _Bool builtin type is included in GCC */ 
/* ISO C Standard: 5.2.5 An object declared as 
type _Bool is large enough to store 
the values 0 and 1. */ 
/* We choose 8 bit to match C++ */ 
/* It must also promote to integer */ 
typedef int8_t _Bool; 
#endif 

/* ISO C Standard: 7.16 Boolean type */ 
#define bool _Bool 
#define true 1 
#define false 0 
#define __bool_true_false_are_defined 1 

#endif 

#endif 

Điều này được lấy từ dự án Ada Class Library.

+0

Cập nhật: _Bool nay được định nghĩa trong VS2013, vì vậy chúng tôi cũng cần phải kiểm tra cho _MSC_VER <1800. http://msdn.microsoft.com/en-us/library/hh409293.aspx – Tom

1

Kích không phải là điều duy nhất mà sẽ không phù hợp ở đây. Trong C++ bool là một từ khóa, và C++ đảm bảo rằng một bool có thể chứa một giá trị là 1 hoặc 0 và không có gì khác. C không cung cấp cho bạn bảo lãnh này. Điều đó nói rằng, nếu khả năng tương tác giữa C và C++ là quan trọng, bạn có thể mô phỏng boolean tùy chỉnh của C bằng cách định nghĩa một cái giống hệt nhau cho C++ và sử dụng nó thay vì bool được dựng sẵn. Đó sẽ là một sự cân bằng giữa một boolean lỗi và hành vi giống hệt nhau giữa boolean C và boolean C++.

0

Một cách logic, bạn không thể chia sẻ mã nguồn giữa C và C++ với tờ khai mâu thuẫn cho bool và họ đã liên kết với nhau.

Cách duy nhất bạn có thể chia sẻ mã và liên kết là thông qua một datastructure trung gian. Thật không may, từ những gì tôi hiểu, bạn không thể sửa đổi mã xác định giao diện giữa chương trình C++ và thư viện C của bạn. Nếu bạn có thể, tôi muốn đề nghị sử dụng một cái gì đó như:

union boolean { 
    bool value_cpp; 
    int value_c; 
}; 

// đệm có thể cần thiết tùy thuộc vào endianness

Hiệu quả của việc đó sẽ làm cho các kiểu dữ liệu chiều rộng như nhau trong cả hai ngôn ngữ; chuyển đổi sang kiểu dữ liệu gốc sẽ cần phải được thực hiện ở cả hai đầu. Trao đổi việc sử dụng bool cho boolean trong định nghĩa hàm thư viện, mã fiddle trong thư viện để chuyển đổi và bạn đã hoàn tất.

Vì vậy, những gì bạn sẽ phải làm thay vào đó là tạo một shim giữa chương trình C++ và thư viện C.

Bạn có:

extern "C" bool library_func_1(int i, char c, bool b); 

Và bạn cần để tạo ra:

bool library_func_1_cpp(int i, char c, bool b) 
{ 
    int result = library_func_1(i, c, static_cast<int>(b)); 
    return (result==true); 
} 

Và bây giờ gọi library_func_1_cpp để thay thế.