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__
輸出做到這一點?
鑑於像如何編寫一個調試宏來在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__
輸出做到這一點?
我不認爲你可以在一般情況下采用了直板宏獨自做到這一點,但你可以使用另一個函數的調用做到這一點。
如果你看看manual page的backtrace
,你會發現一個glibc特定的例程來轉儲堆棧。如果從當前函數X中調用另一個函數Y,並且該函數轉儲堆棧,則堆棧轉儲的第二行將作爲函數X的參數(確保編譯器不內聯該函數)。
可悲此方法沒有特別的便攜式的。 OS-X和Linux有不同的backtrace
類型實現,我相信Windows也是如此。
的va_list
-esque宏只能與可變參數職能的工作。你給的例子不是可變參數函數。我並不完全知道VA_LIST
(大寫)是什麼(也許這是編譯器特有的),但谷歌表示它幾乎相同。
大概不會,除非你認爲'DBG_ARGS(A,B,C)'就可以了。 –
@BoPersson謝謝。我可以接近這種調試打印。通常在調試遞歸函數時,我想看到正在傳遞的參數和正在發送的返回值。如果不是問題中提到的問題,該如何解決這個問題。 –
您可以看看[C'#define'宏用於調試打印](http://stackoverflow.com/questions/1644868/)瞭解了很多想法。它適用於C而不是C++,但大部分都轉移過來。你需要決定如何處理這些類型。如果你處理的是固定數量的相同類型的值(3'int'),那麼它是直接的;如果處理相同類型的可變數量的值,則必須更加努力;如果你處理不同類型的固定數量的值,你必須再努力工作;如果你有不同數量的不同類型的值,你必須努力工作。 –