2013-08-08 39 views
9

Trong/C++ Dự án C của chúng tôi, chúng tôi sử dụng một tiêu đề cấu hình (~ 1000 dòng) đó là đầy đủ cáC# ifdef và # định nghĩaAlternatives/Công cụ cho #define địa ngục C/C++

#if (defined(HW_1) || defined(SOME_TECHNOLOGY_SUPPORTED)) && defined(OTHER_TECHNOLOGY_SUPPORTED) 
#define SOME_FEATURE_AVAILABLE 
#endif 

Trong cấu hình xây dựng, chúng tôi định nghĩa trước một số định nghĩa được chuyển tới trình biên dịch. Điều này dẫn đến các định nghĩa khác nhau (như SOME_FEATURE_AVEILABLE) trong tiêu đề cấu hình của chúng ta.

Vì tiêu đề cấu hình của chúng tôi khá lớn, cũng có một chút lộn xộn.

Có bất kỳ giải pháp thay thế nào cho địa chỉ #define địa ngục này không?

Hoặc có bất kỳ công cụ nào giúp xem trong trường hợp xác định được đặt hay không.

Chúng tôi đang phát triển phần mềm nhúng để chúng tôi không thể thay thế biên dịch có điều kiện theo thời gian chạy nếu có.

+2

Bạn sẽ biên dịch hệ thống nào. Đối với hệ điều hành nào? Tìm kiếm 'autoconf' và' autotools' .... –

+2

Nếu bạn gắn bó với ANSI C89 và ISO C++ 98, thì bạn không cần bất kỳ thứ gì trong số chúng. –

+0

Trình biên dịch có thể tối ưu hóa nếu có điều kiện nếu bạn định nghĩa boolean const tĩnh. – Frodo

Trả lời

1

Trong trường hợp tất cả #define của bạn nằm trong một tệp cấu hình duy nhất, bạn có thể thử thực hiện biên dịch tiền xử lý và sau đó tìm tất cả các macro được xác định. Ví dụ:

$ gcc -DFEATURE1 -DFEATURE2 -E configuration.h | grep '#define' 
1

Bạn có thể muốn đọc về và xem xét C++ thiết kế dựa trên chính sách (http://en.wikipedia.org/wiki/Policy-based_design) được giới thiệu bởi Alexandrescu trong cuốn sách của ông "Modern C++ Thiết kế".

+0

Tôi thích mẫu "cầu nối" với thiết kế dựa trên chính sách: nó đạt được cùng một mục tiêu với các mẫu hoặc nhiều thừa kế. – Michael

+0

Tôi đoán cầu phải chịu một số chi phí thời gian chạy (?). Thiết kế dựa trên chính sách (sử dụng mẫu) thì không. Nhiều kế thừa không gây ra vấn đề ở đây, vì bạn không xử lý các đối tượng như là đối tượng lớp cơ sở (không xử lý chúng đa hình). – JohnB