2010-10-27 97 views
0

是否可以在没有宏的帮助下确定调用某个功能的线路号?确定没有宏的呼叫线路

考虑以下代码:

#include <iostream> 

#define PrintLineWithMacro() \ 
    std::cout << "Line: " << __LINE__ << std::endl; // Line 4 

void PrintLine() 
{ 
    std::cout << "Line: " << __LINE__ << std::endl; // Line 8 
} 

int main(int argc, char **argv) 
{ 
    PrintLine();   // Line 13 
    PrintLineWithMacro(); // Line 14 
    return 0; 
} 

其输出以下:

Line: 8 
Line: 14 

我明白为什么每个打印他们做什么。如果可以在不使用宏的情况下模仿宏功能,我更感兴趣。

+3

获得该行的唯一方法是使用'__LINE__';你必须在某处使用预处理器。 (换句话说,预处理器处理原始*代码*,并且行号是原始*代码*的一部分。) – GManNickG 2010-10-27 01:20:37

回答

5

我会做到以下几点:

#define PrintLine() PrintLine_(__LINE__) 

void PrintLine_(int line) { 
    std::cout << "Line: " << line << std::endl; 
} 

我知道这不会完全删除预处理器,但它确实动大部分的逻辑为实际功能。

+3

这是一个体面的解决方法,因为您*具有*使用宏。但是,您应该明确限定宏(:: PrintLine_,或其中的任何名称空间)中的函数调用并使用括号。 – 2010-10-27 01:28:42

1

不可移植。在任何给定的平台上,基本上可以重新实现调试器的细节 - 信息作为返回地址有效地存储在堆栈中。在某些平台上,您可以使用backtrace()函数获得这种类型的内容。