所以,我必须事先承认我已经知道了答案。我问其他碰巧遇到同样问题的人可以找到解决由不正确的文档引起的问题的方法。
我的环境是VS 2015 C ++,wxWidgets 3.0.2,在Windows 7上开发。
在某些遗留代码中,未检查对wxMkDir的调用是否成功。根据{{3}},wxMkDir的返回类型为bool,如果成功则返回true。但是,它在成功时返回0.
为什么?
答案 0 :(得分:3)
答案是双重的:有两个名称相似的函数wxWidgets documentation,前者记录在案,后者未记录。第二部分是看似有效的假设,即它们表现相同并不是一个有效的假设。
未记录的函数wxMkDir映射到wxCRT_MkDir,后者又映射到wxCRT_MkDirA,然后映射到wxPOSIX_IDENT(mkdir),它为所提到的POSIX函数mkdir创建平台相关名称。根据{{3}}
成功完成后,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返回值。
答案 1 :(得分:1)
wxMkdir()
和wxMkDir()
是wxWidgets为所有标准提供wxFoo()
包装的一般规则的不幸和丑陋的例外(意思是ANSI C或POSIX,实际上是后者与狭义(foo()
)和宽(char*
)版本中存在的C99)函数wchar_t*
相同。
因此,根据这条一般规则,您希望wxMkdir()
表现为std::mkdir()
,但不幸的是wxMkdir()
早在几年之后才会出现wxWidgets的Unicode化身因此,由于向后兼容性而无法实现此规则,因此必须将另一个函数发明为std::mkdir()
的包装器。
当然,到目前为止,向后兼容性的重要性甚至更重,这里似乎没有任何合理的做法 - 除了建议人们使用明确无误的wxFileName::Mkdir()
</sad-story>