func可以获得自称的lineno吗?(C/C++)

kin*_*kai 6 c c++

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

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 }
Run Code Online (Sandbox Code Playgroud)

预期的结果是
Log [Line:9]
Log [Line:10]
但是,事实是
Log [Line:5]
Log [Line:5]

毫不奇怪,LINE在预处理阶段被替换为5.
我的问题是,如何设计日志函数以获得预期结果?
谢谢!

小智 15

你需要写一个宏:

#define LOG printf("Log [Line:%d]\n",__LINE__)
Run Code Online (Sandbox Code Playgroud)

然后使用它:

int main() {
    LOG;
    LOG;
}
Run Code Online (Sandbox Code Playgroud)

这是有效的,因为宏在其使用点扩展,为__LINE__宏提供正确的值.

  • @waffleman不,你不能 - 宏扩展(`__LINE__`宏)在编译器看到代码之前发生. (3认同)