Tôi không khuyên bạn sử dụng #warning, vì nó không phải là tiêu chuẩn C. Bên cạnh đó, bạn muốn cảnh báo điều gì chứ không phải là lỗi? Cảnh báo thường là một cái gì đó trình biên dịch sử dụng khi bạn đang làm một cái gì đó là đáng ngờ của chúng tôi hoàn toàn nguy hiểm, nhưng được cho phép theo tiêu chuẩn C. Bạn không có trường hợp như vậy trong ứng dụng bình thường, bạn sẽ muốn nó hoặc là biên dịch hoàn hảo hay không. Do đó, tôi sẽ sử dụng #error tiêu chuẩn chứ không phải #warning không chuẩn.
Bạn không thể nhập nội dung thực tế của định nghĩa tiền xử lý. Một cái gì đó như thế này có thể đủ:
#if (AAA < SOMETHING) && (AAA > SOMETHING_ELSE)
#error AAA is bad.
#endif
Tôi nghĩ điều này đủ chi tiết cho người lập trình. Tuy nhiên, nếu bạn thực sự muốn biết thêm chi tiết và bạn có trình biên dịch C hiện đại, bạn có thể sử dụng static_assert.Sau đó, bạn có thể đạt được một cái gì đó gần với những gì bạn muốn:
#include <assert.h>
#define xstr(s) str(s)
#define str(s) #s
#define err_msg(x) #x " is " xstr(x)
#define AAA 17
static_assert(AAA != 17, err_msg(AAA));
mớ hỗn độn macro này nên in AAA là 17. Giải thích về cách các macro làm việc có thể được tìm thấy here.
Tôi không chắc liệu static_assert có được bao gồm trong C99 hoặc C11 hay không, chắc chắn là trong C11. Bạn có thể phải sử dụng một số phần mở rộng GCC để kích hoạt nó.
Theo tiêu chuẩn C từ năm 1999, bạn chỉ có '# error' cho một cái gì đó như thế và nó không mở rộng bất kỳ macro nào, nó chỉ in văn bản theo nghĩa đen và làm cho trình biên dịch dừng lại. Những gì bạn đang cố gắng để đạt được với điều này anyway? –
Tôi có một hệ thống phân cấp của nhiều makefiles xác định AAA theo nhiều cách khác nhau, tùy thuộc vào các tham số đích. Tôi muốn xác minh rằng định nghĩa là đúng cho mục tiêu. Và tôi không muốn tạo danh sách #if AAA = 1 ... #warning "là 1" ... – elomage
Ngoài ra, điều này là dành cho thế giới được nhúng không có màn hình, vì vậy tôi không thể dễ dàng kiểm tra giá trị macro bằng thêm một cái gì đó như printf (#AAA); và kiểm tra nó trong thời gian chạy. – elomage