首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >func能得到自称自己的lineno吗?(C/C++)

func能得到自称自己的lineno吗?(C/C++)
EN

Stack Overflow用户
提问于 2010-04-16 09:24:08
回答 3查看 1.8K关注 0票数 6

我有一个问题,因为下面的代码描述了自己。

代码语言:javascript
复制
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.

我的问题是,如何设计日志函数以获得预期的结果?

谢谢!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-04-16 09:26:06

您需要编写一个宏:

代码语言:javascript
复制
#define LOG printf("Log [Line:%d]\n",__LINE__)

然后使用它:

代码语言:javascript
复制
int main() {
    LOG;
    LOG;
}

这是因为宏是在其使用点展开的,给__LINE__宏提供了正确的值。

票数 15
EN

Stack Overflow用户

发布于 2010-04-16 09:27:31

宏可以通过将__LINE__作为参数传递给被调用的函数来克服这一问题。

另一种可能是互补的方法是将某些上下文作为参数传递给函数,其默认值为“使用行号”。下面的代码片段说明了这一点,该代码段正在对模式进行错误处理:

代码语言:javascript
复制
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, ...)

票数 4
EN

Stack Overflow用户

发布于 2010-04-16 10:06:08

您可以稍微修改现有的函数,并将其包装在宏中:

代码语言:javascript
复制
#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();
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2651850

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档