[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