Tôi muốn tạo tệp log.c có chứa các hàm info(), debug() và error(). Các chức năng này đang hoạt động mà không cần in tên tệp, số dòng, .. v.v. Vì vậy, khi tôi gọi một trong những chức năng này tôi muốn đổ tên tập tin, số dòng, và tên chức năng của người gọi. Vậy làm cách nào để chúng tôi theo dõi chính xác? Có cách nào để theo dõi lại trên C hoặc, nếu chúng ta sử dụng macro, làm thế nào điều này có thể được thực hiện?In tên tệp, số dòng và tên hàm của chức năng gọi - C Prog
9
A
Trả lời
21
Tôi muốn vượt qua các dữ liệu đến các chức năng thông qua các thông số (có thể có được sự giúp đỡ của một macro)
int info(const char *fname, int lineno, const char *fxname, ...) { /* ... */ }
int debug(const char *fname, int lineno, const char *fxname, ...) { /* ... */ }
int error(const char *fname, int lineno, const char *fxname, ...) { /* ... */ }
Và để gọi cho họ
info(__FILE__, __LINE__, __func__, ...);
debug(__FILE__, __LINE__, __func__, ...);
error(__FILE__, __LINE__, __func__, ...);
Lưu ý: __func__
là C99; gcc, ở chế độ C89 có __FUNCTION__
5
Nếu bạn sử dụng macro, tôi tin rằng bạn có thể thực hiện tác vụ này bằng cách sử dụng __FILE__
, __LINE__
và __FUNCTION__
. Ví dụ,
#define INFO(msg) \
fprintf(stderr, "info: %s:%d: ", __FILE__, __LINE__); \
fprintf(stderr, "%s", msg);
Bạn có thể sử dụng chức năng quá, nhưng bạn sẽ cần phải vượt qua trong __FILE__
, vv để đảm bảo rằng họ có giá trị đúng.
Các vấn đề liên quan
- 1. Nhận Gọi tên hàm từ chức năng gọi
- 2. Cách lấy tên hàm của con trỏ chức năng C
- 3. Khai báo các tham số chức năng sau tên hàm
- 4. Nhận tên và chức năng gọi điện trong node.js
- 5. Chức năng không gian tên C++
- 6. Chức năng gọi hàm VBA Excel có tên biến
- 7. In ra tên của hàm trong println()?
- 8. Tên tệp và số dòng của danh sách Grep
- 9. In tên hàm gọi tới nhật ký gỡ lỗi
- 10. jquery chức năng cuộc gọi bằng tên
- 11. C++ chức năng cuộc gọi nhận dạng
- 12. tên tệp vs đối tượng tệp làm đối số hàm
- 13. Đặt tên xung đột với built-in chức năng
- 14. C chức năng gọi lại được xác định trong một không gian tên chưa đặt tên?
- 15. Cách xác định tệp, chức năng và số dòng?
- 16. tên tệp và số dòng của tập lệnh python
- 17. Một chức năng của dòng trong C?
- 18. trích xuất tên cuộc gọi chức năng từ một cuộc gọi hàm
- 19. tên in của biến trong C#
- 20. Dòng in Haskell có chức năng
- 21. Chức năng và không gian tên XSLT
- 22. Chức năng và biến có cùng tên
- 23. jquery: Chức năng gọi theo tên khi chọn thay đổi
- 24. Java: Cách lấy tên chức năng người gọi
- 25. Chức năng lớp riêng vs Chức năng trong không gian tên chưa đặt tên
- 26. Gọi một số chức năng trước khi chính trong C
- 27. Tìm tên của biến số Python được chuyển đến hàm
- 28. Javascript: Tên chức năng động
- 29. In tên và giá trị của macro
- 30. Chức năng gọi thành viên của số
http://stackoverflow.com/questions/2651850/can-func-get-the-lineno-who-call-itself-cc – kennytm
có thể trùng lặp với [số dòng C/C++] (http://stackoverflow.com/questions/2849832/cc-line-number) – user7116
@KennyTM: Cảm ơn bạn! Câu trả lời là có. – sura2k