2016-04-25 69 views
6

試圖確定以下C風格代碼中的「現代」的實施:捕捉__LINE__和__FILE__沒有的#define

#define logError(...) log(__FILE__, __LINE__, __VA_ARGS__) 

是可以使用這個可變參數模板或類似的東西,不依賴於捕捉a #define

期望的使用情況:

logError("Oh no! An error occurred!"); 

__FILE__,並且__LINE__在引擎蓋下拍攝的,但反映的地方logError從所謂的文件名和行號。

+2

我不認爲這是可能的。宏存在的原因是,如果有必要,你可以使用它。 –

+0

你有點要求用這種記錄創建軟斷點。 – tadman

回答

5

事實上,預處理器是您想要處理行號和文件名的唯一選擇。

對於編譯器,不可能使用行號和文件名作爲函數調用的參數(或將它們存儲在變量中)。

在我的公司,我們遇到了與測井完全相同的問題。我們結束了一個外部腳本掃描源文件,然後構建適當的函數來調用。

11

宏確實是您的唯一選擇,至少直到std::source_location使其成爲標準並實現您的願望。

+3

'std :: source_location'看起來不錯! * twiddles拇指* – DaveyLaser

+0

這是groovy。我不知道他們是否使用光線追蹤... – user4581301

+0

很酷,不知道那... –