→ handsome616:版上怎麼這麼多神人 12/13 12:37
開發平台(Platform): (Ex: VC++, GCC, Linux, ...)
Visual Studio C++
額外使用到的函數庫(Library Used): (Ex: OpenGL, ...)
N/A
問題(Question):
最近發現一個很好的程式心得網頁,我的問題是在其中一篇
我把它節錄過來方便各位觀看
===== 以下來源:http://www.jeffhung.net/blog/articles/jeffhung/237/ =====
在 C/C++ 裡 debug 的時候,__FILE__ 和 __LINE__ 很好用,
可以幫我們將錯誤發生的地點指出來。
可是,因為 __FILE__ 對應的型別是 const char* (__LINE__ 對應的型別是 size_t),
在使用 wide character I/O 的時候,便不能用。
就算像 L"some string" 一樣,前面加一個 L 也不行,
因為這樣子就變成了 L__FILE__,是另外一個 symbol 了。
空一格也不行,因為 L"some string" 的 L 必須與引號直接連接。
還好,使用 ## 這個 preprocessor operator 可以解決這個問題
#define WIDEN_(x) L##x
#define WIDEN(x) WIDEN_(x)
#define __WFILE__ WIDEN(__FILE__)
===== 以上來源:http://www.jeffhung.net/blog/articles/jeffhung/237/ =====
重要的程式碼只有一行「cout << __WFILE__ << endl;」
照他所說的直接用 #define __WFILE__ WIDEN(L##__FILE__) 定義會顯示找不到 symbol
這個我可以理解,因為他說會變成新的 symbol: L__FILE__
但是為什麼用兩行去定義(如下)也是顯示找不到 symbol: L__FILE__
#define WIDEN(x) L##x
#define __WFILE__ WIDEN(__FILE__)
而用三個 #define (如網頁內文)就找的到可以通過編譯了?
他的這一行 #define WIDEN(x) WIDEN_(x) 並沒有代換到什麼
沒有什麼實質的作用不是嗎?我想了好久都想不到其中的道理
可否麻煩各位大大給我一點提示,謝謝。
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 210.61.122.2
※ 編輯: dbzgtgwduo 來自: 210.61.122.2 (12/13 02:53)