我有一个问题,因为下面的代码描述了自己。
1 #include<stdlib.h>
2 #include<stdio.h>
3 void log()
4 {
5 printf("Log [Line:%d]\n",__LINE__);
6 }
7 int main()
8 {
9 log();
10 log();
11 }预期结果是
日志线:9
日志线:10
但是,事实是
日志线:5
日志线:5
不足为奇的是,生产线在预处理阶段被替换为5.
我的问题是,如何设计日志函数以获得预期的结果?
谢谢!
发布于 2010-04-16 09:26:06
您需要编写一个宏:
#define LOG printf("Log [Line:%d]\n",__LINE__)然后使用它:
int main() {
LOG;
LOG;
}这是因为宏是在其使用点展开的,给__LINE__宏提供了正确的值。
发布于 2010-04-16 09:27:31
宏可以通过将__LINE__作为参数传递给被调用的函数来克服这一问题。
另一种可能是互补的方法是将某些上下文作为参数传递给函数,其默认值为“使用行号”。下面的代码片段说明了这一点,该代码段正在对模式进行错误处理:
int read_byte(FILE* f,int line=0) {
int ret = fgetc(f);
if(-1 == ret)
throw (line? line: __LINE__);
return ret;
}
int read_uint16(FILE* f,int line=0) {
int hi = read_byte(f,(line? line: __LINE__));
int lo = read_byte(f,(line? line: __LINE__));
return (hi<<8)|lo;
}
int main() {
...
try {
int i = read_uint16(f,__LINE__);
} catch(int line) {
fprintf(stderr,"Error at line %d\n",line);
}
...
}最后,这都有点想从C/C++代码中获得堆栈跟踪(特别是在错误处理的情况下)。看看VALGRIND_PRINTF_BACKTRACE(format, ...)
发布于 2010-04-16 10:06:08
您可以稍微修改现有的函数,并将其包装在宏中:
#include<stdlib.h>
#include<stdio.h>
#define log() real_log(__LINE__)
void real_log(int line)
{
printf("Log [Line:%d]\n", line);
}
int main()
{
log();
log();
}https://stackoverflow.com/questions/2651850
复制相似问题