2011-09-19 81 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]