[英]Why does wxMkDir return 0 when successfully creating a directory?
因此,我必須預先承認我已經知道答案了。 我要問的是,碰巧遇到相同問題的其他人可以找到解決方法,以解決由於文檔不正確而導致的問題。
我的環境是在Windows 7上開發的VS 2015 C ++,wxWidgets 3.0.2。
在某些舊版代碼中,未檢查對wxMkDir的調用是否成功。 根據wxWidgets文檔 ,wxMkDir具有布爾類型的返回類型,如果成功,則返回true。 但是,成功時返回0。
為什么?
答案有兩個:有兩個名稱相似的函數wxMkdir和wxMkDir ,前者已記錄在案,而后者未記錄在案。 第二部分是它們將表現相同的看似有效的假設不是有效的假設。
未記錄的函數wxMkDir映射到wxCRT_MkDir,后者又映射到wxCRT_MkDirA,然后映射到wxPOSIX_IDENT(mkdir),后者為所提到的POSIX函數mkdir創建一個依賴於平台的名稱。 根據POSIX文檔的mkdir
成功完成后,mkdir()將返回0。否則,將返回-1,不創建任何目錄,並且應設置errno來指示錯誤。
因此,條件如下:
if (!wxMkDir(newDir)) {
// handle the error here
}
將失敗,但是:
if (wxMkDir(newDir) != 0) {
// handle the error here
}
根據目錄是否已創建,將按預期工作。
已記錄的函數wxMkdir是在wx源文件filefn.cpp中實現的,並使用mkdir,但具有上述條件,可以映射到適當的bool返回值。
wxMkdir()
和wxMkDir()
是wxWidgets為所有標准提供wxFoo()
包裝器的通用規則的不幸和丑陋的例外(這意味着ANSI C或POSIX實際上是后者的標准配置,並且比C99更標准) )函數foo()
存在於窄版( char*
)和寬版( wchar_t*
)中。
因此,根據該一般規則,您希望wxMkdir()
的行為與std::mkdir()
但不幸的是, wxMkdir()
早於wxWidgets的Unicode化,所以該規則無法由於向后兼容,因此實現了此功能,因此必須發明另一個功能,只是將其包裝為std::mkdir()
。
當然,到目前為止,向后兼容性的重要性甚至更大,在這里似乎確實沒有任何合理的選擇-除了建議人們使用毫不含糊的wxFileName :: Mkdir() 。
</sad-story>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.