2013-03-20 50 views
1

我有以下一組宏(我從How can I use the compile time constant __LINE__ in a string?的第一個答案中得到)試圖讓我有一個宏'LOCATION_PREFIX',我可以用它來「捕捉」一行的位置代碼(將被傳遞給將執行日誌記錄的其他函數)。宏中的C++連接

#define STRINGIZE(f,l) STRINGIZE2(f) "(" STRINGIZE2(l)"):" 
#define STRINGIZE2(x) #x 
#define LOCATION_PREFIX STRINGIZE(__FILE__, __LINE__) 

int main(){ 

printf("%s here\n", LOCATION_PREFIX); 
printf("%s over here\n", LOCATION_PREFIX); 

return 1; 
} 

輸出:

「t.cpp」(8):這裏
「t.cpp」(9):在這裏

我想要的輸出爲:

t.cpp(8):這裏
t.cpp(9):在這裏

任何幫助,非常感謝!

回答

4

你不需要第一STRINGIZE2調用,爲文件名已經是一個帶引號的字符串:

#define STRINGIZE(f,l) f "(" STRINGIZE2(l) "):" 
#define STRINGIZE2(x) #x 
#define LOCATION_PREFIX STRINGIZE(__FILE__, __LINE__) 

int main(){ 
    printf("%s here\n", LOCATION_PREFIX); 
    printf("%s over here\n", LOCATION_PREFIX); 

    return 1; 
} 
+0

乾杯!完美地工作,非常感謝你的快速反應......我會盡快接受答案。 – Scottymac 2013-03-20 15:32:52

+1

注意,你也可以放棄'STRINGIZE'的'f'參數並直接放入'__FILE__'。但我沒有這樣做,所以與你的代碼有明確的關係。 – 2013-03-20 15:34:10

+0

我會給這個旋轉thx! – Scottymac 2013-03-20 15:44:38