簡體   English   中英

宏從函數中獲取函數名稱和參數值

[英]Macro to Get function name and parameter values from within function

我正在研究調試/日志記錄程序,並且想知道是否可以創建一個我可以在每個函數中粘貼的宏,並且每次調用函數時它都會打印函數名和參數值。 函數名稱可以在編譯時恢復,問題是如何打印參數值?

更新:我記得讀過一篇文章來獲取參數但是調用匯編代碼和工作操作堆棧指針,這不是跨平台兼容的 - 我需要的東西。

您可以使用__FUNCTION____func__宏作為函數名稱。 對於參數,我認為沒有一個內置宏來實現這一點。

其他有用的宏是__LINE____FILE__

編輯:

__FUNCTION____func__不是標准的一部分,但它們得到廣泛支持。

16.8處理預定義的宏:

__cplusplus
__DATE__
__FILE__
__LINE__
__STDC_HOSTED__
__TIME__

和實現定義的宏:

__STDC__
__STDC_VERSION__
__STDC_ISO_10646__

對於函數名稱,可以使用標准(自C99)標識符__func__

在C ++中,GNU擴展標識符__PRETTY_FUNCTION__也將打印參數類型。

您可以使用可變參數宏 ,然后將字符串格式和函數參數傳遞給它。 每個函數的宏都不完全相同(因為每個函數可能有不同的參數),但大部分工作在於復制粘貼上面一行的參數。

如果您的功能簽名是:

void func(char *param1, int param2);

你的宏將是這樣的:

PROFILE_FUNC(__FILE__, __LINE__, "param1 = %s, param2 = %d", param1, param2);

PROFILE_FUNC之后的部分(__ FILE __,_ _ _ _ _,...將是可變的。查看鏈接,了解如何完成此操作。

如果沒有人在七年內消化得更好,那一定是要走的路。 如果您可以找到__PRETTY_FUNCTION__如何獲取參數類型,則可以進一步自動執行此操作。

編輯

這個鏈接很有用。 它描述了如何在運行時獲取應用程序的回溯的三種方法:

  1. gcc builtin macro __builtin_return_address
  2. glibc backtracebacktrace_symbols
  3. libunwind

C宏系統不能隱式引用參數。 你必須把它們傳遞給它。

因為一個小的勝利宏​​可以計算他們的參數,所以它將是TRACE(foo,bar)而不是TRACE2,TRACE3等。這並不比在函數開始時編寫TRACE()差。

實際上打印這些值會很好。 重載運算符<<或用_Generic手動滾動它,具體取決於語言。

干凈利落地做這種事情,例如推斷參數,動態地打開和關閉打印,可以通過代碼生成器訪問。 兩種風格:1 /解析C或特定注釋。 見swig,doxygen。 2 /從其他東西生成日志記錄功能和C.

解析C似乎更常見。 可能是因為您可以輕松地將其添加到現有代碼中。 從另一個輸入生成更容易可靠地執行。 編寫函數名,參數列表,包含實現的字符串,如XML / JSON一樣。 除了模板,我喜歡生成C和元數據的python和lua腳本。 另請參見LLVM的tablegen。

沒有可移植的方法來獲取所有參數值並打印它們 - 你當然不能從宏中做到這一點。 您可能必須使用其他方法來實現您想要的效果。

以下是一些使用宏進行調試的示例和技巧。 MS 特定列表和GNU列表

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM