Tôi có một mô hình về cơ bản là một số mã soạn sẵn với một phần mà thay đổi ở giữaBạn có thể sử dụng khối mã làm đối số cho macro C không?
if(condition){
struct Foo m = start_stuff();
{ m.foo = bar(1,2); m.baz = 17; } //this part varies
end_stuff();
}
Is it OK để thực hiện một taht vĩ mô mất rằng khối mã trung gian như một cuộc tranh cãi? Các quy tắc để mở rộng macro trong C có vẻ phức tạp đến mức tôi không chắc chắn nếu không có bất kỳ trường hợp góc nào có thể đến và cắn tôi trong tương lai (đặc biệt, tôi không hiểu cách đối số macro được tách ra nếu mã của tôi có dấu phẩy trong đó).
#define MY_MACRO(typ, do_stuff) do { \
if(condition){ \
struct typ m = start_stuff(); \
do_stuff; \
end_stuff(); \
} \
}while(0)
//usage
MY_MACRO(Foo, {
m.foo = bar(1,2);
m.baz = 17;
});
Cho đến nay điều duy nhất mà tôi cố gắng nghĩ ra được break
và continue
bị bắt nếu tôi sử dụng báo cáo lặp trong vĩ mô của tôi và đó sẽ là một sự cân bằng có thể chấp nhận đối với trường hợp sử dụng cụ thể của tôi.
chỉnh sửa: Tất nhiên, tôi đã sử dụng một hàm nếu có thể. Ví dụ tôi sử dụng trong câu hỏi này được đơn giản hóa và không hiển thị các bit chỉ có thể hoạt động với ma thuật macro.
Do-while-false là thành ngữ chuẩn cho phép bạn thoát khỏi macro nếu cần. Đặt phòng duy nhất của tôi về macro là nó làm cho gỡ lỗi khó khăn, đặc biệt là trong các tình huống tai nạn. Nếu có một khối macro dài khoảng 100 dòng, và sau khi chạy trong 5 giờ, mã bị treo ở đâu đó trong đó trên một trong hàng trăm cuộc gọi đến macro, bạn sẽ gặp khó khăn khi theo dõi nó xuống. – cup
Để biên dịch lỗi, hãy sử dụng clang. Nó xác định các lỗi cú pháp bên trong các macro lớn. Đối với các lỗi thời gian chạy, tôi thường sử dụng 'gcc -E prog.c | grep -v^# | indent> prog-dbg.c' và sau đó biên dịch và liên kết' prog-dbg.c' sang mã khác. Đó là vụng về nhưng làm việc. – user172818
Khái niệm của bạn có vẻ không sao vì nó ... nhưng tại sao bạn không gọi lại các cấu trúc hàm để làm cho cuộc sống của bạn dễ dàng hơn? Tốc độ nội tuyến có quan trọng không? như @cup chỉ ra đây là một nỗi đau để gỡ lỗi. –