バグ の日記

やられた!

パーマリンク by バグ on 2010年11月10日(水) 22:45

とあるWINAPI関数のお話。

戻り値がBOOL型だったので…

if (abc() == TRUE)
// なんらかの処理

みたいに書いてたら、戻り値が16だった為、なんにも処理されないという罠!

たしかにBOOL型の中身はint型だから何を代入したっていいんだけど、それならば、どうしてBOOL型を使っているのかは意味不明。

TRUEかFALSE以外を返す可能性があるならば、int型でええやんか!と思うのは私だけ?

BOOLやboolってのはTRUE(true) or FALSE(false)、でないといけないと思うのは私だけ?
最後に編集したユーザー バグ [ 2010年11月11日(木) 09:17 ], 累計 1 回

コメント

Re: やられた!

パーマリンク by a5ua on 2010年11月10日(水) 23:25

ブール代数にはtrueとfalseの二つの値がありますが、C言語では、ゼロでない数はtrue、ゼロはfalseとなるので、「成功したらゼロ以外の値(すなわちtrue)を返す」という仕様の関数はアリだと思います。
ただし、この仕様においては、「trueとの比較はすべきではない」と言えます。
よって、trueか否かを調べるときは、
if (XXX) ~ または、if (XXX != 0) ~
となり、逆にfalseかどうかを調べるときは、
if (!XXX) ~ または、if (XXX == 0) ~
といった感じになりますね。(0の部分はNULLとかFALSEとかの場合もある。)

Re: やられた!

パーマリンク by バグ on 2010年11月11日(木) 06:39

いや理屈はそうなんでしょうが、それならば真偽値を使用する理由がないですよね?
そもそも、MSDNにも『成功したらTRUE、失敗したらFALSEを返す』と明記されていましたし…(^_^;)

Re: やられた!

パーマリンク by へろりくしょん on 2010年11月11日(木) 08:19

紛らわしいですね。 なんて言う API ですか?

私の場合、TRUE FALSE と比較する事なんてありませんけども、仕様で TRUE を返すと言ったら、マクロ TRUE を返して欲しいものですね。

CreateFile() を見ると
関数が失敗すると、INVALID_HANDLE_VALUE が返ります。 とありますし。

LockWindowUpdate() も戻り値の型は BOOL ですが
関数が成功すると、0以外の値が返ります。
関数が失敗すると、0が返ります。
って書いてあるくせに。

TRUE を返すと言ったら、TRUE を返してくれなきゃ詐欺ですよ。 とぅるとぅる詐欺です。

まぁ、MSDN が嘘つきなのは今に始まった事ではありませんが。

Re: やられた!

パーマリンク by バグ on 2010年11月11日(木) 09:21

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.

Re: やられた!

パーマリンク by へろりくしょん on 2010年11月11日(木) 11:10

また、えらくマイナーどころの API ですね。
私だったら、GetFileAttributes() GetFileAttributesEx() あたりを呼び出しているところです。

最新かどうかは分かりませんが、オンラインで見てみました。

文面は多少違いますが、修正されてはいないようです。

Returns TRUE if the path is a valid directory (FILE_ATTRIBUTE_DIRECTORY is set), or FALSE otherwise.

いろいろ調べ見ると、あっちの国でもいろいろ文句言われてますね。

Re: やられた!

パーマリンク by バグ on 2010年11月11日(木) 13:37

え?これって?マイナーだったんですか?
名前も分かり易いし、割とメジャーなのかと思ってました(^_^;)

Re: やられた!

パーマリンク by へろりくしょん on 2010年11月12日(金) 08:14

個人的に、kernel32・user32・gdi32・comdlg32・shell32・commctrl32 あたりの基本的な DLL に含まれない API はマイナーだと思ってます。

PathIsDirectory()はモジュール shlwapi.dll 内に実装されているようですが、全く意識した事がありません。
他にも、StrChr とか、StrCmpN とか C の標準ライブラリを置き換えたかのような主に文字列処理周りの API が多数書かれているようですが、それほど使われているとはちょっと、思えませんねぇ。

AllocateAndGetUdpExTableFromStack()のような、一般に公開されていない API よりかはメジャーだとは思いますが。
と、一応グーグル先生に聞いてみたらしっかりと MSDN に載っているようでした。 いつの間にドキュメント化されたんだろ。

Re: やられた!

パーマリンク by ISLe on 2010年11月17日(水) 18:31

遅レスすみません。

戻り値がBOOL型なのにさいきんになって-1だけ特別扱いしないと困ると言い出したAPIがありますよね。
「0 以外の値、0、-1 のいずれかを返します」(MSDNより)って矛盾してるし。
GetMessageなんていう超メジャーなAPIですけど。

(そもそも無駄だから)真偽値を比較するなというのはよく耳にします。
b == TRUE
b != TRUE
b == FALSE
b != FALSE
の4種類より
b
!b
の2種類から見分けられる方が読みやすい気がします。

Re: やられた!

パーマリンク by バグ on 2010年11月17日(水) 22:28

b == TRUE
b != TRUE
b == FALSE
b != FALSE

うーん、困ったことに私は上記の方が見やすい&美しいと感じる人間なんですよね(苦笑)
まぁ、この辺りは多分に個人的な好みの問題になりますので…(^_^;)
結論としてはMSDNを信用しきってはいけないということで…(笑)