2014-07-25 82 views
3

我想知道是否有宏或標準方式(用於調試目的)自動打印函數f的參數值,就像__FUNCTION__打印/顯示函數簽名?例如,如何自動打印輸入C++函數參數值

void foo(int x, string y) { 
    cout << __FUNCTIION_ARGS__ << endl; 
} 

應顯示x,並y值。

如果沒有這樣的魔法標準方式,是否可以編寫一個宏/模板來做到這一點?

--Update--

每@ JXH的評論,如果有問題的函數內部打印是不可能的宏/模板,是可以自動去做就呼叫側,喜歡的東西:

call(foo,x,y); 

它打印每個參數值,並且表現與foo(x,y)彷彿它是在每一個其他方面直接調用相同?如果某個值不可打印(例如指針,函數),則包裝call只能打印一個不透明的值,如<ptr><noprint>

謝謝

P.S.我正在使用gcc,(並且在將來也會發出叮噹聲)。

+0

總之,沒有。像在過去的美好時代一樣用手寫字。 –

+0

請注意'__PRETTY_FUNCTION__'不是標準的C++(我認爲?),它是一個至少由* gcc *支持的preproosessor擴展,也是由* clang *我相信(但不同的輸出?)。您可能想要指定您正在使用的編譯器(編輯問題以添加標記)。 – hyde

+0

@hyde謝謝。建議編輯。 – tinlyx

回答

0

有打印參數沒有宏,但你可以使用它的__PRETTY_FUNCTION__宏觀

2

我拿打印的函數原型:

#include <iostream> 

// Dummy parameter-pack expander 
template <class T> 
void expand(std::initializer_list<T>) {} 

// Fun 
template <class Fun, class... Args> 
typename std::result_of<Fun&&(Args&&...)>::type 
call(Fun&& f, Args&&... args) { 

    // Print all parameters 
    std::cout << "Params : "; 
    expand({(std::cout << args << ' ', 0)...}); 
    std::cout << '\n'; 

    // Forward the call 
    return std::forward<Fun>(f)(std::forward<Args>(args)...); 
} 

// Random test function 
int myFunc(std::string const &s, double d, int i) { 
    std::cout << s << ' ' << d << ' ' << i << '\n'; 
    return 57; 
} 

int main() 
{ 
    // Painless call 
    std::cout << call(myFunc, "hello", 3.14, 42) << '\n'; 

    return 0; 
} 

輸出:

Params : hello 3.14 42 
hello 3.14 42 
57 

可變參數模板很有趣!

+0

您可以避免使用http://ideone.com/iOcMGj – Davidbrcz

+0

@Davidbrcz擴大訣竅,實際上這正是我以前的看法(請參閱編輯)。我假設一個無操作函數比遞歸函數更容易編譯器優化。 – Quentin

+0

在這一點上,我不在乎優化。我關心代碼的可讀性。而你的訣竅使得代碼可讀性差得多 – Davidbrcz