とあるWINAPI関数のお話。
戻り値がBOOL型だったので…
if (abc() == TRUE)
// なんらかの処理
みたいに書いてたら、戻り値が16だった為、なんにも処理されないという罠!
たしかにBOOL型の中身はint型だから何を代入したっていいんだけど、それならば、どうしてBOOL型を使っているのかは意味不明。
TRUEかFALSE以外を返す可能性があるならば、int型でええやんか!と思うのは私だけ?
BOOLやboolってのはTRUE(true) or FALSE(false)、でないといけないと思うのは私だけ?
やられた!
Re: やられた!
ブール代数にはtrueとfalseの二つの値がありますが、C言語では、ゼロでない数はtrue、ゼロはfalseとなるので、「成功したらゼロ以外の値(すなわちtrue)を返す」という仕様の関数はアリだと思います。
ただし、この仕様においては、「trueとの比較はすべきではない」と言えます。
よって、trueか否かを調べるときは、
if (XXX) ~ または、if (XXX != 0) ~
となり、逆にfalseかどうかを調べるときは、
if (!XXX) ~ または、if (XXX == 0) ~
といった感じになりますね。(0の部分はNULLとかFALSEとかの場合もある。)
ただし、この仕様においては、「trueとの比較はすべきではない」と言えます。
よって、trueか否かを調べるときは、
if (XXX) ~ または、if (XXX != 0) ~
となり、逆にfalseかどうかを調べるときは、
if (!XXX) ~ または、if (XXX == 0) ~
といった感じになりますね。(0の部分はNULLとかFALSEとかの場合もある。)
Re: やられた!
紛らわしいですね。 なんて言う API ですか?
私の場合、TRUE FALSE と比較する事なんてありませんけども、仕様で TRUE を返すと言ったら、マクロ TRUE を返して欲しいものですね。
CreateFile() を見ると
関数が失敗すると、INVALID_HANDLE_VALUE が返ります。 とありますし。
LockWindowUpdate() も戻り値の型は BOOL ですが
関数が成功すると、0以外の値が返ります。
関数が失敗すると、0が返ります。
って書いてあるくせに。
TRUE を返すと言ったら、TRUE を返してくれなきゃ詐欺ですよ。 とぅるとぅる詐欺です。
まぁ、MSDN が嘘つきなのは今に始まった事ではありませんが。
私の場合、TRUE FALSE と比較する事なんてありませんけども、仕様で TRUE を返すと言ったら、マクロ TRUE を返して欲しいものですね。
CreateFile() を見ると
関数が失敗すると、INVALID_HANDLE_VALUE が返ります。 とありますし。
LockWindowUpdate() も戻り値の型は BOOL ですが
関数が成功すると、0以外の値が返ります。
関数が失敗すると、0が返ります。
って書いてあるくせに。
TRUE を返すと言ったら、TRUE を返してくれなきゃ詐欺ですよ。 とぅるとぅる詐欺です。
まぁ、MSDN が嘘つきなのは今に始まった事ではありませんが。
Re: やられた!
PathIsDirectoryというやつでございます。
開発環境がVC++6.0なので、新しい環境では修正されている可能性もありますが…。
以下コピペ
PathIsDirectory
BOOL PathIsDirectory(LPCTSTR pszPath);
Verifies that a path is a valid directory.
Returns TRUE if the path is a valid directory, or FALSE otherwise.
pszPath Address of the path to verify.
開発環境がVC++6.0なので、新しい環境では修正されている可能性もありますが…。
以下コピペ
PathIsDirectory
BOOL PathIsDirectory(LPCTSTR pszPath);
Verifies that a path is a valid directory.
Returns TRUE if the path is a valid directory, or FALSE otherwise.
pszPath Address of the path to verify.
Re: やられた!
また、えらくマイナーどころの API ですね。
私だったら、GetFileAttributes() GetFileAttributesEx() あたりを呼び出しているところです。
最新かどうかは分かりませんが、オンラインで見てみました。
文面は多少違いますが、修正されてはいないようです。
Returns TRUE if the path is a valid directory (FILE_ATTRIBUTE_DIRECTORY is set), or FALSE otherwise.
いろいろ調べ見ると、あっちの国でもいろいろ文句言われてますね。
私だったら、GetFileAttributes() GetFileAttributesEx() あたりを呼び出しているところです。
最新かどうかは分かりませんが、オンラインで見てみました。
文面は多少違いますが、修正されてはいないようです。
Returns TRUE if the path is a valid directory (FILE_ATTRIBUTE_DIRECTORY is set), or FALSE otherwise.
いろいろ調べ見ると、あっちの国でもいろいろ文句言われてますね。
Re: やられた!
個人的に、kernel32・user32・gdi32・comdlg32・shell32・commctrl32 あたりの基本的な DLL に含まれない API はマイナーだと思ってます。
PathIsDirectory()はモジュール shlwapi.dll 内に実装されているようですが、全く意識した事がありません。
他にも、StrChr とか、StrCmpN とか C の標準ライブラリを置き換えたかのような主に文字列処理周りの API が多数書かれているようですが、それほど使われているとはちょっと、思えませんねぇ。
AllocateAndGetUdpExTableFromStack()のような、一般に公開されていない API よりかはメジャーだとは思いますが。
と、一応グーグル先生に聞いてみたらしっかりと MSDN に載っているようでした。 いつの間にドキュメント化されたんだろ。
PathIsDirectory()はモジュール shlwapi.dll 内に実装されているようですが、全く意識した事がありません。
他にも、StrChr とか、StrCmpN とか C の標準ライブラリを置き換えたかのような主に文字列処理周りの API が多数書かれているようですが、それほど使われているとはちょっと、思えませんねぇ。
AllocateAndGetUdpExTableFromStack()のような、一般に公開されていない API よりかはメジャーだとは思いますが。
と、一応グーグル先生に聞いてみたらしっかりと MSDN に載っているようでした。 いつの間にドキュメント化されたんだろ。