Xét đoạn mã sau:C++ chức năng cuộc gọi nhận dạng
void Foo() {
......
LOG_ERROR("I'm error 1") // call 1
.....
LOG_ERROR("I'm error 2") // call 2
.....
}
LOG_ERROR()
là một macro. LOG_ERROR()
nên in chuỗi xác định mã trong mã, trong khi giả định là mã có thể thay đổi, nhưng A::Foo()
sẽ không thay đổi. Mã nhận dạng sẽ giữ lại trong khi mã số thay đổi.
Điều này có thể được giải quyết bằng cách thêm mã lỗi như là đối số để LOG_ERROR()
, nhưng chúng tôi muốn loại bỏ từ các lập trình viên gánh nặng quản lý lỗi mã.
Sử dụng __LINE__
không phải là câu trả lời, vì Foo()
có thể di chuyển từ bản dựng đến .
Vì vậy, tôi nghĩ về việc xác định LOG_ERROR()
tương đối để bắt đầu của Foo()
:
- a. Xác định theo tên tệp (
__FILE__
) + tên hàm (__FUNCTION__
) + số dòngLOG_ERROR()
liên quan đếnFoo()
bắt đầu. - b. Xác định theo tên tệp (
__FILE__
) + tên hàm (__FUNCTION__
) +LOG_ERROR()
số điện thoại trongFoo()
.
Giải pháp nên hoạt động với VC++ 2008 và g ++ 4.1.1 ít nhất.
Một giải pháp đề xuất (link text) là:
#define ENABLE_LOG_ERROR static const int LOG_ERROR_start_line = __LINE__
#define LOG_ERROR(s) cerr << "error #" << (__LINE__ - LOG_ERROR_start_line) \
<< " in " << __func__ << ": " << s << endl
void Foo() {
ENABLE_LOG_ERROR;
//...
LOG_ERROR("error 1");
int i;
LOG_ERROR("error 2");
}
Điều này sẽ buộc người sử dụng để viết ENABLE_LOG_ERROR
trong đầu mỗi hàm chứa LOG_ERROR()
và cũng có khá nhiều chức năng như vậy.
Có cách nào khác để hoàn thành tác vụ không?
@idimba, nếu không quá nhiều rắc rối, bạn có thể sử dụng tập lệnh để tự động thêm 'ENABLE_LOG_ERROR;' ngay sau mỗi tên hàm. Tôi sử dụng mẹo đó khi tôi * khám phá * mã của bên thứ ba. –
Ý tưởng hay, nhưng nó sẽ ảnh hưởng đến __LINE__ mà chúng tôi sử dụng rộng rãi trong khai thác phụ khai thác gỗ của chúng tôi. – dimba