我有一套在Win32API和MFC上使用的異常類,它們捕獲當前的Win32錯誤代碼(GetLastError()
)並且制定一條關於它發生的位置的人類可讀信息。管理參數默認分配的規則是什麼?
在ctor開始工作之前,我依賴於捕獲當前錯誤代碼的能力,假設在調用ctor之前必須解析ctor的參數。
但是我遇到了當前版本中的問題,在VS2013中將編譯工具從120_xp切換到120(我不是100%確定這是更改的來源 - 它可能會暫時擱置一段時間與平臺工具集更改無關)。但是,我會認爲沒有一個是相關的 - 即C++會要求首先解決所有參數,然後執行函數調用,以便下面的默認參數error
始終具有當前的錯誤代碼調用構造函數(這可能會改變它):
這裏的調用上下文:
m_file = CreateFile(filename, FILE_GENERIC_READ, FILE_SHARE_READ, nullptr, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, nullptr);
if (!m_file) // NOTE: m_file is smart handle and it's operator bool() knows that the invalid file handle is "false"
throw CWin32APIErrorException(__FUNCTION__, _T("CreateFile"), GetLastError());
如果我改變調用環境迫使當前錯誤代碼捕獲,我其實做得到錯誤2:
m_file = CreateFile(filename, FILE_GENERIC_READ, FILE_SHARE_READ, nullptr, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, nullptr);
if (!m_file)
{
auto error = GetLastError();
throw CWin32APIErrorException(__FUNCTION__, _T("CreateFile"), error);
}
FormatString
簡單,它保留了當前的錯誤代碼:
CStringW FormatString(const wchar_t * format, ...)
{
const DWORD dwError = ::GetLastError();
va_list args;
va_start(args, format);
CStringW str;
str.FormatV(format, args);
::SetLastError(dwError);
return str;
}
我遇到的問題是,我看到錯誤122:緩衝液供應到系統調用太小。但是調用此異常的錯誤代碼是錯誤2:找不到文件。
我更喜歡我的軟件報告「文件未找到」,這是更正確和可操作的。
所以: 1.我錯了,C++保證所有參數在函數調用(ctor)被調用之前解決? 2.還能在哪裏調用來作出越來越有可能改變當前錯誤代碼(CString的構造函數(S)是唯一的其他東西CWin32APIErrorException::CWin32APIErrorException()
構造函數。
含義是CString的構造函數顯然是改變當前錯誤之前被調用? !唉
有人可以讓我知道我錯了,在我的理解
謝謝
參數評測的順序是不確定的,所以是的,CString的構造函數可以讓你的方式。 –
謝謝雷蒙德。我剛剛有一個預感 - 事實證明,這是因爲我們正在編譯unicode - 所以'__FUNCTION__'正在被轉換爲CString ctor中的一個寬字符串,這引發了一些導致內部錯誤122的事情。 ( – Mordachai
)這會比較容易修復,因爲你將字符串文字傳遞給了構造函數,所以它不需要'CString'參數,只需使用'LPCTSTR'(使用預處理器將'__FUNCTION__'宏轉換爲)解決了構造參數時執行任意代碼的問題你是否還有其他調用上下文需要傳遞動態生成的字符串? –