Trong một số dự án tôi đã thực hiện trong C, tôi đã thích sử dụng các macro sau đó làm việc tương tự như Perl của cảnh báo và chết chương trình con:Có tương đương C cho mô-đun Cá chép của Perl không?
#include <stdio.h>
#include <stdlib.h>
#define warn(...) \
fprintf(stderr, __VA_ARGS__); \
fprintf(stderr, " at %s line %d\n", __FILE__, __LINE__)
#define die(...) \
warn(__VA_ARGS__); \
exit(0xFF)
Liệu bất cứ điều gì tồn tại như cá chép Perl, tiếng kêu, túc túc, và thú nhận chương trình con từ Carp? Tôi muốn có một cái gì đó để báo cáo lỗi từ quan điểm của người dùng.
Nếu không, tôi biết có hàm backtrace() và backtrace_symbols() trong glibc cùng với tùy chọn gccnamric gcc có thể cung cấp cho tôi một backtrace tên hàm và địa chỉ mã. Nhưng tôi muốn một cái gì đó tốt hơn một chút; với quyền truy cập vào tên tệp, dòng và chức năng trong ngăn xếp cuộc gọi như trình con người gọi của Perl. với điều đó tôi có thể viết libcarp của riêng tôi để sử dụng trong các chương trình c của tôi.
EDIT: 2009-10-19
Tôi đang nghĩ đến việc tạo một cái gì đó mà sử dụng gdb khi sẵn trên basename (argv [0]), sau đó xử lý các vết đống để sản xuất các loại khác nhau của thông điệp tôi muốn . Nó sẽ có thể xác định nếu im không trong một thực thi debuggable, hoặc một hệ thống mà không gdb, trong trường hợp đó, cá chép và cluck sẽ trở thành cảnh báo và craok và thú nhận sẽ trở thành chết.
Tôi chưa bao giờ sử dụng gdb như thế này trước đây (Ive chỉ chạy nó với chương trình của tôi lúc đầu, không phải trong khi nó đang chạy). Nhưng tôi tìm thấy một vài hàm trong glib (g_on_error_stack_trace và stack_trace) trông rất gần với những gì tôi muốn làm: Nó dồn một quá trình gdb với tên đối số basename (argv [0]) và id tiến trình, sau đó ghi vào stdin của nó (đã được chuyển hướng đến một đường ống) lệnh "backtrace" theo sau là "quit". Sau đó nó đọc từ kết quả của nó và phân tích nó theo cách nó thích. Đây gần như chính xác những gì tôi cần làm.
Đối với những người không quen thuộc với Perl, cá chép và croak làm những gì các mẫu cảnh báo và chết macro làm, chỉ với tập tin và dòng từ người gọi của phụ hiện tại. cluck và thú nhận làm như vậy, chỉ với một dấu vết stack hoàn chỉnh. (một số chi tiết được đơn giản hóa) – ysth
Tài liệu tại: http://perldoc.perl.org/Carp.html – Ether
Đối với các macro đa tuyên bố thực sự, chúng tôi khuyên bạn nên bọc chúng vào {...} trong khi (0), để thực hiện sử dụng như một tuyên bố làm việc như mong đợi. – unwind