我正試圖改進現有C++程序中的SQLite錯誤處理。我有一個自定義類型SQLiteException,並且我想寫一個宏來打印SQL的行號,文件名和錯誤消息。變量參數和函數重載
我已經定義了以下功能:
LogMessage(LPCTSTR message); // Does the real work. Appends a timestamp to the message and logs the message to disk
LogMessage(LPCSTR message); // Simply converts message from ASCII to UNICODE and calls the original LogMessage(LPCTSTR message) function.
LogMessage(LPCTSTR message, ...); // A new variable argument version of the function. It uses vsprintf to format into a temporary TCHAR string, and passes that string into the first LogMessage(LPCTSTR message) function.
這是我遇到的麻煩。編譯器抱怨對重載函數的模糊呼叫。第三個功能是實現這樣的:
void LogMessage(LPCTSTR message, ...)
{
TCHAR logBuffer[513];
va_list args;
va_start(args, message);
_vsntprintf(logBuffer, 512, message, args);
va_end(args);
LogMessage((LPCTSTR)logBuffer);
}
}
我已經加入宏是這樣寫的:
#define LOG_SQLITE_EXCEPTION(e) LogMessage(_T("%s %s %d"), CString(__FUNCTION__), CString(__FILE__), __LINE__); LogMessage(GetSQLiteErrorMessage(e));
我怎樣才能使編譯器調用的LogMessage的第一個版本函數在執行第三個版本?編譯器似乎忽略了'...'參數,並且無法分辨LogMessage的第一個和第三個實現之間的區別。
我會推薦給這些功能(一點點)更具描述性的名稱。 – nielsj 2010-05-20 16:07:17
這條線btw:LogMessage((LPCTSTR)logBuffer); – nielsj 2010-05-20 16:08:42
我將更改名稱,以使編譯器和其他程序員更清楚。 – 2010-05-20 16:51:59