2011-09-19 78 views
15

在我最近与我的经理讨论过一次时,他提到他以前的一个客户使用C++宏来记录关于每行代码的信息。他们所要做的就是在开始运行之前启用一个环境变量。 (当然环境变量仅在试验台启用C++宏来记录每一行代码

日志中提到使用的变量及其相应的值也 例如,对于行:。

a = a + b; 

日志会说是这样的:

"a = a + b; (a = 5 + 3)" 

就个人而言,我不知道这是否是可能的,但他很肯定这一点已经存在,虽然他不记得代码的细节

所以,这里是(明显的)问题:这可能吗?你能提供这个代码吗?

+0

在你的问题,我的包裹日志消息双引号(表明它是一个日志消息)。希望没关系。 – iammilind

+0

有没有这样的事情作为一个C++宏,这当然是不可能与香草C预处理器宏。其他一些工具必须生成值字符串。 – spraff

+1

我认为不可能像“a = a + b”那样记录空行,但可以在行中使用像“LOG(a = a + b)”这样的宏,并且断言宏已经在执行它。 – Dialecticus

回答

18

我不知道每行/变量是否可以像这样扩展,但可以记录函数调用。我使用gcc的-finstrument-functions选项记录了所有函数调用。它将调用:

void __cyg_profile_func_enter (void *this_fn, void *call_site); 

void __cyg_profile_func_exit (void *this_fn, void *call_site); 

的功能进入和退出。

The docs explain how to use it.我不知道其他编译器是否提供类似的东西。

+2

+1之间以获得有趣的发现 – trojanfoe

+1

MSVC++对'_penter()具有'/ Gh'和'/ GH''和'_pexit()'函数,它们分别在每个函数的开头和结尾被调用:http://msdn.microsoft.com/en-us/library/c63a9b7h.aspx –

0

您可以检查如何BOOST_CHECKA from Boost.Test is implemented。它在内部使用表达式模板。

对于测试:

#define BOOST_TEST_MAIN 

#include <boost/test/included/unit_test.hpp> 
#include <boost/test/test_tools.hpp> 

BOOST_AUTO_TEST_CASE(test1) 
{ 
    int a=0; 
    int b=1; 
    int c=2; 
    BOOST_CHECKA(a+b == c); 
} 

输出是:

Running 1 test case... 
main.cpp(11): error: in "test1": check a+b == c failed [0+1!=2] 

*** 1 failure detected in test suite "Master Test Suite" 

注值在方括号中:[!0 + 1 = 2]

它有一定的局限性。

对于测试:

BOOST_CHECKA((a+b) == c); 

输出为:

check (a+b) == c failed [1!=2]