2016-03-10 3 views
0

Итак, я должен признать заранее, что я уже знаю ответ. Я прошу, чтобы другие, которые попали в ту же проблему, могли найти решение проблемы, вызванное неправильной документацией.Почему wxMkDir возвращает 0 при успешном создании каталога?

Моя среда VS 2015 C++, WxWidgets 3.0.2, разработка на Windows 7.

В некоторых унаследованного кода, вызовы wxMkDir были не проверены на успех. Согласно wxWidgets documentation, wxMkDir имеет тип возврата bool и возвращает true, если он успешный. Однако при успешном завершении он возвращает 0.

Почему?

ответ

3

Ответ двоякий: есть две функции с похожими именами: wxMkdir and wxMkDir, причем первая документально оформлена, а вторая не документирована. Вторая часть состоит в том, что кажущаяся действительная презумпция того, что они будут вести себя одинаково, не является допустимым предположением.

Недокументированная функция wxMkDir сопоставляется с wxCRT_MkDir, которая, в свою очередь, сопоставляется с wxCRT_MkDirA, а затем с wxPOSIX_IDENT (mkdir), которая создает зависимое от платформы имя для упомянутой функции POSIX, mkdir. Согласно POSIX documentation for 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.

1

wxMkdir() и wxMkDir() являются несчастным и некрасивым исключением из общего правила, которое WxWidgets обеспечивает wxFoo() оболочки для всех стандартного (имеется в виде либо ANSI C или POSIX, как на практике, последний примерно так же стандартное и более, чем C99) функций foo() существующий как в узком (char*), так и в широком (wchar_t*) вариантах.

Таким образом, согласно этому общему правилу, можно было ожидать wxMkdir() вести себя как std::mkdir(), но, к сожалению, wxMkdir() предшествовала, по уже несколько лет, Unicode-кации из WxWidgets и поэтому это правило не может быть реализован из-за него обратная совместимость и другая функция должна была быть изобретена как обертка для std::mkdir().

И к настоящему времени, конечно, вес обратной совместимости еще более тяжелый, и здесь, по-видимому, нет ничего разумного, кроме как рекомендовать людям использовать wxFileName::Mkdir(), что недвусмысленно.

</sad-story>

+0

Благодарим за информацию. Иногда полезно понять, почему все стало таким, каким они есть, вместо того, чтобы оставаться в стороне. Таким образом, вверх. :) – hlongmore