作者Keitaro (動き出す時間...)
看板C_and_CPP
標題[問題] 請問不定參數函式怎寫override?
時間Thu Jul 16 22:57:26 2020
開發平台(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
→ 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