看板 C_and_CPP 關於我們 聯絡資訊
開發平台(Platform): (Ex: VC++, GCC, Linux, ...) BCB 額外使用到的函數庫(Library Used): (Ex: OpenGL, ...) OpenGL 問題(Question): class ManagerBase { //略 virtual const ObjectBase *GetObject(unsigned int index) const = 0; } 在抽象類別 ManagerBase 裡面定義一個虛擬函式, 該虛擬函式回傳值 ObjectBase* 也是抽象類別。 這時候我打 ManagerBase *manager; manager->GetObjectA //自動建立程式碼的功能表就自己跳出 GetObjectA //反而沒有GetObject 但不論有沒有補A,程式編譯都正常, 請問編譯器幫我補A是為什麼呢? -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 39.14.5.30 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1456103506.A.43B.html
LPH66: 我猜跟 windows API 裡的 GetObject 混淆了... 02/22 09:37
LPH66: windows API 裡跟字串有關的函式都會有 A 版跟 W 版 02/22 09:38
LPH66: 分別給非 unicode 程式跟 unicode 程式使用 02/22 09:39
LPH66: 實際上使用時會根據編譯時的巨集定義把名字 #define 成 02/22 09:39
LPH66: 該取的版本; 如果 BCB 沒有實際去抓你的程式碼而只是單純 02/22 09:40
LPH66: 使用已有的字典檔或索引檔來給建議大概就會發生這問題 02/22 09:41
LPH66: 突然想到一個可能性: 由於引入了 <windows.h> 的關係 02/22 09:42
LPH66: 根據上面所言裡面定義了 #define GetObject GetObjectA 02/22 09:43
LPH66: 所以事實上你的 class 裡定義的是 GetObjectA 這函式 02/22 09:43
LPH66: 但也因為有這個 #define 的關係, 加不加 A 都會順利編譯 02/22 09:43
LPH66: 而這個自動完成看起來是類似編譯途中建立的索引拿來用 02/22 09:45
LPH66: 所以它的記錄裡面記的是 GetObjectA 這名字, 自然自動補上 02/22 09:45
LPH66: 解決法...我現在只想到改函數名一途 Orz 02/22 09:46
noodleT: 改名稱後就沒出現了,謝謝 02/22 10:16
suhorng: 真是一段淒美的故事 02/22 18:00
Killercat: C沒namespace,悲劇 02/23 10:53
uranusjr: 這好厲害 XDDDD 02/24 10:31
LPH66: 一個月後的補遺: GotW#63 http://www.gotw.ca/gotw/063.htm 03/21 18:37
LPH66: 講的正是這篇文章的問題 03/21 18:38