Tôi đang tìm kiếm macro tương tự với cấu trúc có. Việc sử dụng nên được một cái gì đó như:"có" macro trong C
with (lock(&x), unlock(&x)) {
...
}
Nó có thể có ích cho một số mục đích khác.
tôi đến với macro này:
#define __with(_onenter, _onexit, v) \
for (int __with_uniq##v=1; __with_uniq##v > 0;)\
for (_onenter; __with_uniq##v > 0; _onexit) \
while (__with_uniq##v-- > 0)
#define _with(x, y, z) __with(x, y, z)
#define with(_onenter, _onexit) _with(_onenter, _onexit, __COUNTER__)
Nó có 3 vòng lồng nhau vì nó nên:
- Initialize loop truy cập (C99 chỉ, tất nhiên)
- Có thể khởi tạo _onenter biến (chẳng hạn như
with (int fd=open(..), close(fd))
) - Cho phép
break
bên trong khối mã. (continue
cũng được phép. Và macro có thể được điều chỉnh thànhassert()
nó ra)
Tôi đã sử dụng mã này trên hệ điều hành XV6 và có vẻ khá hữu ích.
Câu hỏi của tôi là - các sự cố tồi tệ nhất với macro như vậy là gì? Tôi có nghĩa là, bên cạnh việc sử dụng chỉ của một vĩ mô C (đặc biệt là một trong đó thực hiện mới kiểm soát dòng chảy xây dựng).
Cho đến nay đã phát hiện ra những nhược điểm/vấn đề:
- Không hỗ trợ
return
hoặcgoto
(nhưng nó có thể tiết kiệm một sốgoto
s trong mã kernel) - Không hỗ trợ cho các lỗi (như
fd < 0
). Tôi nghĩ cái này có thể sửa được. - gnu89/c99 trở lên chỉ (bộ đếm vòng lặp. Không cần sử dụng biến số duy nhất)
- Hơi kém hiệu quả hơn so với khóa mở khóa đơn giản. Tôi tin nó không đáng kể.
Có sự cố nào khác không? Có cách nào tốt hơn để thực hiện cấu trúc tương tự trong C?
Ồ. phản ứng cuối cùng ... Cảm ơn bạn, tôi không biết về 'cleanup' - âm thanh hữu ích. Liệu macro có vấn đề cụ thể hơn, bên cạnh sự đáng sợ của nó? – Elazar
Việc thiếu sự hỗ trợ cho 'return' có vẻ như một bộ ngắt thỏa thuận, trừ khi bạn đang làm việc với một tiêu chuẩn mã hóa nghiêm ngặt đối với các câu lệnh' return' ở giữa các hàm. Một 'return' trong một khối' with' sẽ trông không dễ thấy nhưng sẽ tàn phá vào thời gian chạy. – pdw
Tôi hiểu và đồng ý rằng 'return' là một vấn đề lớn (vì vậy' cleanup' tốt hơn nhiều). Nhưng không 'goto' yêu cầu tiêu chuẩn mã hóa nghiêm ngặt như nhau? Những ưu điểm của goto, về mặt này là gì? – Elazar