Ví dụ, gần đây tôi đã bắt gặp điều này trong kernel linux:
/ * Buộc lỗi biên dịch nếu điều kiện là đúng * / #define BUILD_BUG_ON (điều kiện) ((void) sizeof (char [1 - 2 * !! (điều kiện)]))
Vì vậy, trong mã của bạn, nếu bạn có một số cấu trúc phải có, giả sử có nhiều kích thước 8 byte, có thể do một số hạn chế về phần cứng, bạn có thể thực hiện:
BUILD_BUG_ON ((sizeof (struct myst struct)% 8)! = 0);
và nó sẽ không biên dịch trừ khi kích thước của struct struct struct là bội số của 8 và nếu nó là bội số của 8, thì không có mã thời gian chạy nào được tạo ra cả.
Một mẹo khác mà tôi biết là từ cuốn sách "Đồ họa đá quý" cho phép một tệp tiêu đề duy nhất để khai báo và khởi tạo các biến trong một mô-đun trong khi trong các mô-đun khác sử dụng mô-đun đó, chỉ đơn thuần khai báo chúng là externs.
#ifdef DEFINE_MYHEADER_GLOBALS #define TOÀN CẦU #define INIT (x, y) (x) = (y) #else #define bên ngoài TOÀN CẦU #define INIT (x, y) #endif TOÀN CẦU int INIT (x, 0); TOÀN CẦU int somefunc (int a, int b);
Cùng với đó, mã xác định x và somefunc thực hiện:
#define DEFINE_MYHEADER_GLOBALS #inc loại "the_above_header_file.h"
trong khi mã chỉ đơn thuần sử dụng x và somefunc () thì:
#inc loại "the_above_header_file.h"
Vì vậy, bạn nhận được một tệp tiêu đề khai báo cả hai phiên bản toàn cầu và nguyên mẫu hàm khi cần và các khai báo bên ngoài tương ứng.
Vì vậy, các thủ thuật lập trình C yêu thích của bạn dọc theo những dòng đó là gì?
BUILD_BUG_ON
macro, có gì sai khi sử dụng #error
bên trong và #if
?