u16suzuの blog

日々学んだことのメモブログです。

[ios] Objective-C の BOOL型は int型でどのように定義されているのか

Objective-C の BOOL型はint型で以下のように定義されている.

YES: 1
NO: 0

objc.h ヘッダファイルにもそのように定義されている. 忘れたら BOOLの定義を ctrl+gで見れば良い. objc.hでの定義内容を以下に示す.

/// Type to represent a boolean value.
typedef signed char BOOL; 
// BOOL is explicitly signed so @encode(BOOL) == "c" rather than "C" 
// even if -funsigned-char is used.

#if __has_feature(objc_bool)
#define YES __objc_yes
#define NO  __objc_no
#else
#define YES ((BOOL)1)
#define NO  ((BOOL)0)
#endif

C言語時代から 0 = true と思い込んでいたがそれと逆で焦った. C言語も含むUnix 文化では異常終了ではない場合 return 0; するが そのことから誤解していたようだ. Boolと 関数の終了値は微妙に違うし, よりによって逆なのでややこしい.

コードを書いて試してみた.

$ cat hoge.c
#include <stdio.h>

int main(){
        if(1){
                printf("OK");
        }else{
                printf("NG");
        }

        return 0;
} 
$ ./a.out
OK

結論c言語とObjcでは 1がtrue, 0がfalse だけど c言語では異常終了しない関数は 0 を返すのが慣例

参考: Geekなぺーじ(C言語入門:main関数でのreturn文) http://www.geekpage.jp/programming/c/return-main.php