[英]Anonymous objects on the stack, in C++?
我正在開發一個日志記錄/跟蹤單元(請不要指向現有的單元,這是為了獲得與結果相同的體驗)。
為了獲得運行時調用堆棧跟蹤,我們的想法是首先構造一個TraceObject
實例,輸入一個函數,它攜帶當前類和函數的信息。 有點類似於:
TraceObject to( "MyClass", "myClassFunction" );
TraceObject
的構造函數在每個線程堆棧上推送this
,析構函數再次彈出它。 因此可以查詢堆棧以獲得調用堆棧。
我讓這個工作滿意。 然而,有一個小打小報告:對象to
。 根據設計,它永遠不會被該名稱所引用。 因此,它不需要具有名稱,尤其是可能與客戶端使用的任何標識符沖突的名稱(或者,在_
前綴的情況下,實現)。
TL;博士
是否有可能在堆棧上創建一個匿名的非臨時對象(即一個將在函數返回之前生效但沒有標識符的對象),如果是,它將如何完成?
沒有。
C ++中有匿名對象,臨時表是表達式的結果,但它們只存在於它們所在語句的上下文中。
如果你真的試圖聲明一個匿名對象,你會混淆解析器,它會認為你正在聲明...一個函數!
但那么,有必要嗎?
如果您接受使用宏來實際聲明TraceObject
,那么對每個跟蹤使用宏都很簡單; 從而提供那里的階級和功能。 使用__func__
或等效項,您可以提取類名和函數名(所需的字符串解析位,取決於編譯器)並從那里開始工作。
當然,無論如何,您將為每條跟蹤使用一個宏,因為您可能需要文件名和行號!
正如我在評論中所說,無法使用范圍有限的匿名變量。
#define BEGIN_LOG TraceObject abcdefghij( "", __func__ );
void Function(){
BEGIN_LOG;
//bla bla
}
如果有一個編譯器宏來獲取類名,這應該這樣做。
編輯:沒有運氣,有一個簡單的方法來獲取類名,你可能需要做類似於類名宏建議。 或者只是使用__FILE__
。
編輯:您可能想嘗試__func__
和__FUNCTION__
來查看其中一個或兩個是否按__func__
工作。 也沒有指定C ++標准。
一些行號:
#define XPASTE(arg1, arg2) PASTEX(arg1, arg2)
#define PASTEX(arg1, arg2) arg1 ## arg2
#define TRACELOG() \
TraceObject XPASTE(trace_object, __LINE__)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.