我正在研究一個調試/日誌記錄程序,並想知道是否可以創建一個可以粘貼到每個函數內部的宏,並且它將打印函數名稱以及每次調用函數時的參數值。函數名稱可以在編譯時解決,問題是如何打印參數值?宏從函數內部獲取函數名稱和參數值
更新:我記得閱讀一篇文章來獲取參數,但它調用了彙編代碼和工作操作堆棧指針,這不是跨平臺兼容的 - 我需要的東西。
我正在研究一個調試/日誌記錄程序,並想知道是否可以創建一個可以粘貼到每個函數內部的宏,並且它將打印函數名稱以及每次調用函數時的參數值。函數名稱可以在編譯時解決,問題是如何打印參數值?宏從函數內部獲取函數名稱和參數值
更新:我記得閱讀一篇文章來獲取參數,但它調用了彙編代碼和工作操作堆棧指針,這不是跨平臺兼容的 - 我需要的東西。
您可以使用__FUNCTION__
或__func__
宏作爲函數名稱。對於參數,我不認爲有一個內置的宏來實現這一點。
其他有用的宏是__LINE__
和__FILE__
。
編輯:
__FUNCTION__
和__func__
不是標準的一部分,但它們被廣泛的支持。
16.8涉及預定義宏:
__cplusplus
__DATE__
__FILE__
__LINE__
__STDC_HOSTED__
__TIME__
和宏實現定義:
__STDC__
__STDC_VERSION__
__STDC_ISO_10646__
'__func__' *是標準的一部分,但它不是一個宏。也許這就是爲什麼你沒有在那個地方找到它。 – 2012-03-01 20:24:44
@JensGustedt我們在談論C++標準? – 2012-03-01 20:27:14
不,我在談論C.在C11中它是6.4.2.2,一個預定義的標識符,而不是一個宏。 AFAIR已經在C99中,所以它也應該在C++中。 – 2012-03-01 20:41:48
對於函數名,你可以使用標準的(因爲C99)標識符__func__
。
在C++中,GNU擴展標識符__PRETTY_FUNCTION__
也將打印參數類型。
提問者聲明他知道如何從宏中獲取函數名 - 他擔心的是打印函數參數。 – Perry 2012-03-01 20:47:52
沒有可移植的方式來獲取所有的參數值並打印它們 - 你肯定不能從宏中完成。你可能需要使用另一種方法來實現你想要的。
另一種方法是什麼?我當然可以用宏來替代C代碼。 – tunafish24 2012-03-01 19:59:01
你可以做一些醜陋的事情,在這些事情中你使用一個爲函數聲明剔除代碼的宏來完成所有的函數聲明,然後在函數本身的頭部打印出它們的值。這不太好 - 我不會走這條路。那種方式就是瘋狂。在現實世界中,只需使用gdb,或在需要時打印所需的內容。 – Perry 2012-03-01 20:06:59
@Perry你會怎麼做呢?如果你能提供一個實際的例子,請+1。 – 2012-03-01 20:13:23
C或C++?不同的語言。 – Puppy 2012-03-01 19:51:27
但兩者的宏應該是相同的,我選擇了擴大觀衆 – tunafish24 2012-03-01 19:53:55