2015-10-04 33 views
1

鑑於像如何編寫一個調試宏來在C++中打印函數的所有參數(strace樣式)?

void f(int a, int b, char c) { 


---macro here---- 

} 

現在DBG_ARGS任何函數應該有像
f(a = 1, b = 2, c = A)

我們可以使用VA_LIST#x__FUNCTION__輸出做到這一點?

+1

大概不會,除非你認爲'DBG_ARGS(A,B,C)'就可以了。 –

+0

@BoPersson謝謝。我可以接近這種調試打印。通常在調試遞歸函數時,我想看到正在傳遞的參數和正在發送的返回值。如果不是問題中提到的問題,該如何解決這個問題。 –

+1

您可以看看[C'#define'宏用於調試打印](http://stackoverflow.com/questions/1644868/)瞭解了很多想法。它適用於C而不是C++,但大部分都轉移過來。你需要決定如何處理這些類型。如果你處理的是固定數量的相同類型的值(3'int'),那麼它是直接的;如果處理相同類型的可變數量的值,則必須更加努力;如果你處理不同類型的固定數量的值,你必須再努力工作;如果你有不同數量的不同類型的值,你必須努力工作。 –

回答

1

我不認爲你可以在一般情況下采用了直板宏獨自做到這一點,但你可以使用另一個函數的調用做到這一點。

如果你看看manual pagebacktrace,你會發現一個glibc特定的例程來轉儲堆棧。如果從當前函數X中調用另一個函數Y,並且該函數轉儲堆棧,則堆棧轉儲的第二行將作爲函數X的參數(確保編譯器不內聯該函數)。

可悲此方法沒有特別的便攜式的。 OS-X和Linux有不同的backtrace類型實現,我相信Windows也是如此。

va_list -esque宏只能與可變參數職能的工作。你給的例子不是可變參數函數。我並不完全知道VA_LIST(大寫)是什麼(也許這是編譯器特有的),但谷歌表示它幾乎相同。

相關問題