考虑下面的代码:C++函数呼叫标识符
void Foo() {
......
LOG_ERROR("I'm error 1") // call 1
.....
LOG_ERROR("I'm error 2") // call 2
.....
}
LOG_ERROR()
是一个宏。 LOG_ERROR()
应该在代码中打印标识它的字符串 ,而假设代码可以更改,但A::Foo()
将保持不变。在代码 更改时,标识符应保留。
这可以通过将错误代码作为参数来解决,以LOG_ERROR()
, 但是我们想从程序员卸下包袱管理错误 代码。
使用__LINE__
不是答案,因为Foo()
可以从构建移动到 构建。
因此我认为有关识别LOG_ERROR()
相对于开始的 Foo()
:
- 一个。通过文件名识别(
__FILE__
)+函数名称(__FUNCTION__
)+ 行号LOG_ERROR()
相对于Foo()
开始。 - b。按照文件名称(
__FILE__
)+功能名称(__FUNCTION__
)+LOG_ERROR()
呼叫号码Foo()
。
解决方案应该至少与VC++ 2008和g ++ 4.1.1一起工作。
所提出的一种解决方案(link text)为:
#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");
}
这将迫使用户在含有 LOG_ERROR()
并且有许多是这样的功能的各功能的启动写ENABLE_LOG_ERROR
。
是否有其他方式来完成任务?
@idimba,如果没有太多的麻烦,可以使用脚本在每个函数名后面自动添加`ENABLE_LOG_ERROR;`。当我*探索*第三方代码时,我使用该技巧。 – 2009-07-10 09:05:34
不错的主意,但它会影响我们在日志记录子系统中广泛使用的__LINE__。 – dimba 2009-07-10 14:25:22