Các câu trả lời hiện có chỉ cho thấy cách đạt được hiệu quả của "xác nhận thời gian biên dịch" dựa trên kích thước của một kiểu. Điều đó có thể đáp ứng nhu cầu của OP trong trường hợp cụ thể này, nhưng có những trường hợp khác mà bạn thực sự cần một bộ tiền xử lý có điều kiện dựa trên kích thước của một loại. Đây là cách thực hiện:
Viết cho mình một chương trình C nhỏ như:
/* you could call this sizeof_int.c if you like... */
#include <stdio.h>
/* 'int' is just an example, it could be any other type */
int main(void) { printf("%zd", sizeof(int); }
Biên dịch đó. Viết một tập lệnh bằng ngôn ngữ kịch bản yêu thích của bạn, ngôn ngữ này chạy chương trình C ở trên và ghi lại đầu ra của nó. Sử dụng đầu ra đó để tạo tệp tiêu đề C. Ví dụ: nếu bạn đang sử dụng Ruby, nó có thể giống như sau:
sizeof_int = `./sizeof_int`
File.open('include/sizes.h','w') { |f| f.write(<<HEADER) }
/* COMPUTER-GENERATED, DO NOT EDIT BY HAND! */
#define SIZEOF_INT #{sizeof_int}
/* others can go here... */
HEADER
Sau đó, thêm một quy tắc vào Makefile của bạn hoặc tập lệnh xây dựng khác, điều này sẽ làm cho nó chạy tập lệnh trên để xây dựng sizes.h
.
Bao gồm sizes.h
bất cứ nơi nào bạn cần sử dụng các điều kiện tiền xử lý dựa trên kích thước.
Làm xong!
(Bạn đã bao giờ gõ ./configure && make
để xây dựng một chương trình chưa? configure
Về cơ bản, những tập lệnh nào làm giống như phần trên ...)