これは当方が実際にやって気づいたことであるが、ブーリアンを引数とする関数にポインタをそのまま渡してしまうと意図せぬ動作になってしまう。特にポインタがNULLかどうかを判定して挙動を振り分けようとする際にはバグの原因となる。
例えば以下のようなコードがある(インクルード等は省略、また、実際に動かすことは想定していない)。
[code lang=”C”]void someFunction(_Bool trueOrFalse)
{
// anything to do
}
int main()
{
AnyObject *obj = (AnyObject *)calloc(1, sizeof(AnyObject));
someFunction(obj);
free(obj);
return 0;
}[/code]
この場合、someFunctionの処理はobjがNULLかどうかで処理を振り分けるように見えるかもしれないが、実際にはそうではなく、意図せぬ挙動になってしまう。
それを防ぐには、以下のように書けばよい
[code lang=”C”]void someFunction(_Bool trueOrFalse)
{
// anything to do
}
int main()
{
AnyObject *obj = (AnyObject *)calloc(1, sizeof(AnyObject));
someFunction(obj ? true : false);
free(obj);
return 0;
}[/code]
こうすればobjがNULLかどうかで(NULLでなければtrue、NULLであればfalse)で処理を振り分けることができるようになる。
記述を省略したくなることが往々にしてあるが、バグの原因となり得ることがあるので是非気をつけよう。
ウェブマスター。本ブログでITを中心にいろいろな情報や意見などを提供しています。主にスマートフォン向けアプリやウェブアプリの開発を携わっています。ご用の方はコメントかコンタクトフォームにて。