看板 C_and_CPP 關於我們 聯絡資訊
開發平台(Platform): (Ex: Win10, Linux, ...) win10 編譯器(Ex: GCC, clang, VC++...)+目標環境(跟開發平台不同的話需列出) Visual studio 2008 額外使用到的函數庫(Library Used): (Ex: OpenGL, ...) 問題(Question): 請問不定參數函式 怎寫override? 程式碼(Code):(請善用置底文網頁, 記得排版,禁止使用圖檔) http://codepad.org/68O4dTXM 補充說明(Supplement): 上方連結的程式碼是個示意example 假設CBaseLogger已經是一個做好的logger 基本功能(開檔寫檔)都在CBaseLogger::Log()裡面了 CDerivateLogger僅僅是加入一個flag 用來開啟or關閉寫log的功能 請問此處我該如何撰寫關於CDerivateLogger::Log()這個函式的override才正確呢? 先在此感謝各位板友。 補充: 我發現這問題時看到奇怪的現象 1. 一開始我沒發現CDerivateLogger::Log()這樣寫是有問題的 Log檔裡面寫出來的是對的 2. 後來我為了要debug, 因此把VC的optimize關閉, 然後發現突然程式會crash 有時候沒有crash, 但Log裡面寫出來一堆亂碼 3. 我仔細看code後才發現這邊可能有問題, 但即使如此, 為何在release build的情況下 Log竟然能寫出正確的值? 是否va_start/va_list/va_end這幾個function在release build能夠找到正確的參數? -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 1.163.153.2 (臺灣) ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1594911449.A.CB7.html ※ 編輯: Keitaro (1.163.153.2 臺灣), 07/16/2020 23:04:08
Lipraxde: 看起來比較像是要問怎麼傳 varargs 07/16 23:06
Lipraxde: https://bit.ly/2CJp3UV 07/16 23:06
nh60211as: 我猜release build直接去call CBaseLogger::Log 07/16 23:38
Lipraxde: Release build 的時候可能是被優化成 tail call 了。由 07/16 23:53
Lipraxde: 於 varargs 是放在 stack 上傳的,所以 CBaseLogger::L 07/16 23:53
Lipraxde: og 可以拿到傳入的參數。 07/16 23:53
原來如此 感謝以上兩位板友 ※ 編輯: Keitaro (1.163.153.2 臺灣), 07/17/2020 00:03:05