簡體   English   中英

堆棧中的匿名對象,用C ++編寫?

[英]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.

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