2015-09-17 21 views
5

Mô tả ngắn:Loại trừ tiêu đề?

Header.h#include <stdbool.h> trong đó có một Macro cho _Bool trong c.

file.cpp bao gồm Header.h, nhưng kể từ file.cpp là C++ - nó có bool làm kiểu gốc. Bây giờ lint than phiền về một tập hợp các điều do điều này (redeclaration, phương pháp không tồn tại, vv). Có cách nào để ngăn chặn bao gồm của <stdbool.h> trong file.cpp mà không cần chạm Header.h?

Nếu mô tả của tôi về một vấn đề có vẻ vô lý - vui lòng ném cà chua vào tôi :) Nếu không, nhờ sự giúp đỡ.

Edit: Bây giờ nghĩ đến việc này một lần nữa: biết các khái niệm cơ bản về lập và liên kết tôi nên đã nhận ra rằng 'trừ' một số tiêu đề trong tệp downstream/tiêu đề nghe có vẻ hài hước và không nên có thể không cludges. Nhưng vẫn còn, cảm ơn sự giúp đỡ. Một viên gạch nhỏ khác để tôi hiểu về điều này.

+7

Khiếu nại với nhà cung cấp thư viện của bạn. 'stdbool.h' không nên định nghĩa' bool' và bạn bè làm macro trong C++. Trong thời gian đó, '# undef'. –

+2

Bạn có thể sửa đổi 'header.h' không? Sau đó, chỉ cần thêm kiểm tra tiền xử lý có điều kiện cho '__cplusplus' trước khi bao gồm' '. Và bạn có thể muốn xem xét cái linter của bạn, nó dường như không xử lý C++ rất tốt, hoặc nó không làm tiền xử lý rất tốt. –

+2

@ T.C. nó không phải là đơn giản, C++ 98 nói gì về '' vì ảnh hưởng của nó trong C++ 98 là không xác định. GCC's ' 'định nghĩa các macro cho C++ 98, vì các lý do. Lý do crappy. Nó ít nhất cũng có '#define bool bool' trong C++ mặc dù, không phải' #define bool _Bool' đang tích cực gây hại. –

Trả lời

9

Bạn có thể tạo riêng của bạn stdbool.h và đặt nó trước đó trong đường dẫn bao gồm vì vậy nó được tìm thấy trước khi một hệ thống. Đó là hành vi về mặt kỹ thuật không xác định, nhưng bạn có một chia <stdbool.h> do đó, nó là một cách để làm việc xung quanh đó. phiên bản riêng của bạn, hoặc có thể là rỗng (nếu nó sẽ chỉ được bao gồm bởi các file C++) hoặc nếu bạn không thể ngăn chặn nó cũng được sử dụng bởi các file C sau đó bạn có thể làm:

#if __cplusplus 
# define __bool_true_false_are_defined 1 
#elif defined(__GNUC__) 
// include the real stdbool.h using the GNU #include_next extension 
# include_next <stdbool.h> 
#else 
// define the C macros ourselves 
# define __bool_true_false_are_defined 1 
# define bool _Bool 
# define true 1 
# define false 0 
#endif 

Một giải pháp sạch sẽ để làm điều này trong file.cpptrước bao gồm Header.h:

#include <stdbool.h> 
// Undo the effects of the broken <stdbool.h> that is not C++ compatible 
#undef true 
#undef false 
#undef bool 
#include "Header.h" 

Bây giờ khi Header.h bao gồm <stdbool.h> nó sẽ không có hiệu lực vì nó đã được bao gồm. Bằng cách này về mặt kỹ thuật là không hợp lệ (xem bình luận dưới đây), nhưng trong thực tế gần như chắc chắn sẽ hoạt động ổn định.

Nó cần phải được thực hiện trong mỗi tệp bao gồm Header.h, vì vậy bạn có thể bọc nó trong tiêu đề mới và sử dụng thay vì Header.h ví dụ: CleanHeader.h có chứa:

#ifndef CLEAN_HEADER_H 
#define CLEAN_HEADER_H 
// use this instead of Header.h to work around a broken <stdbool.h> 
# include <stdbool.h> 
# ifdef __cplusplus 
// Undo the effects of the broken <stdbool.h> that is not C++ compatible 
# undef true 
# undef false 
# undef bool 
#e ndif 
# include "Header.h" 
#endif 
+1

Cách tiếp cận thứ hai về mặt kỹ thuật vi phạm [macro.names]/p2 :) –

+1

@ T.C. doh! Bạn nói đúng, tôi sẽ sửa yêu cầu của tôi hợp lệ.Tôi nghĩ rằng đó là giải pháp tốt nhất mặc dù, kể từ khi cố gắng để viết hợp lệ C + + với một std :: lib không phù hợp là khó khăn! –

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