Tôi đến từ một nền C#, nhưng tôi đang học C vào lúc này. Trong C#, khi người ta muốn báo hiệu rằng một lỗi đã xảy ra, bạn ném một ngoại lệ. Nhưng bạn làm gì trong C?C: Làm thế nào để bạn mô phỏng một 'ngoại lệ'?
Ví dụ: bạn có ngăn xếp với các hàm push
và pop
. Cách tốt nhất để báo hiệu là ngăn xếp trống trong một pop
là gì? Bạn quay trở lại từ chức năng đó là gì?
double pop(void)
{
if(sp > 0)
return val[--sp];
else {
printf("error: stack empty\n");
return 0.0;
}
}
K&R 's ví dụ từ trang 77 (mã trên) trả về một 0.0
. Nhưng điều gì sẽ xảy ra nếu người dùng đã đẩy 0.0
trước đó lên ngăn xếp, làm cách nào để bạn biết liệu ngăn xếp có trống hay liệu giá trị chính xác có được trả về không?
Tôi không đồng ý, một chút, bởi vì ngay cả khi tôi hiểu ý bạn, tôi sẽ không cho ai đó đến từ java/C# land giả định rằng setjmp/longjmp là bất kỳ cách nào 'giải pháp' cho 'ngoại lệ của tôi là ở đâu?' – Jonke
Lưu ý rằng rất ít mã C sử dụng setjmp/longjmp vì lý do lịch sử. Mã lỗi là cách C thông thường. Mã lỗi không tốt lắm; thiếu ngoại lệ trong C là lý do chính khiến nhiều ngôn ngữ hiện đại trở nên tốt hơn. – Nelson
ANSI đã mã hóa 'setjmp 'để đảm bảo hoạt động (ít nhất nếu trình biên dịch phù hợp với tiêu chuẩn), nhưng chuyển đổi ngăn xếp và đồng thời có chưa được chuẩn hóa, do đó, vẫn còn là vấn đề phải viết chủ đề an toàn gói cho C (thậm chí sử dụng asm để chuyển đổi ngữ cảnh) vì trình biên dịch * có thể * (mặc dù nó có thể khó xảy ra) thực hiện tối ưu hóa và biến đổi phá vỡ các giả định trong gói luồng. – Jonke