GLib 2が用意している基本的なデータ型について(ページ3/3)
「GLib 2が用意している基本的なデータ型について(ページ2/3)」の続き。
特別な型
真偽値
真偽値としてgboolean型という型があり、TRUE(真)もしくはFALSE(偽)という値をとる。if文の丸括弧にこの型の変数のみを入れると、それがTRUEの場合にif文の条件が真となる。
gboolean b; /* (途中でTRUEもしくはFALSEの値を入れる) */ if (b) { /* bがTRUEの場合の処理 */ }
汎用ポインタ
任意のデータの場所を指し示す汎用ポインタと呼ばれるデータ型(void *)にgpointerという別名が付いており、この名前で利用できる。
指し示す先が変更されることがない(変更してはいけない)場合にはgconstpointer(「const void *」に等しい)という名前の型が使える。
gsize,gssize,goffset
gsize型は読み書きを行うような関数で何かのサイズを指定するなどの際に用いられる。範囲は(0 - G_MAXSIZE)で、負の値はとらない。
gssize型はgsize型を符号付きにしたもので、関数への引数で特別な意味として(「0」を指定するのと違った意味で)「-1」を入れる場合があるようなときに用いられる。範囲は(G_MINSSIZE - G_MAXSSIZE)。
この他、GLib 2.14以上ではファイル内のある基準からの位置の違い(オフセット)の用途向けにgoffsetという型も用意されている。符号付きで(G_MINOFFSET - G_MAXOFFSET)の範囲をとる。
Vala言語における型
(GLib/GObjectの仕組み上で動作するため)Vala言語における基本的なデータ型はGLibのデータ型を用いている。例えばVala言語のint型はGLibのgint型で、Vala言語のint64型はGLibのgint64型となる。
型ごとの上下限の値については
- int64.MIN
- int64.MAX
のようにそれぞれ「[型名].MIN」「[型名].MAX」が用いられる。
「GLib 2が用意している基本的なデータ型について(ページ2/3)」の中でC言語の場合について扱っているprintf()系関数のフォーマット文字列については「int64.FORMAT」のように「[型名].FORMAT」が用いられる。
GLibのgsize型はsize_t型,gssize型はssize_t型という名前になっている。
真偽値型(bool型)の値については
- true(真)
- false(偽)
のように全て小文字の表記となる(C#言語などと同様)。
Vala言語のnull可指定
変数を宣言する際、データ型の名前の末尾に「?」が付けると、その変数は「null」という特別な値をとることができる。関数の戻り値の型に付けるとreturn文で戻り値に「null」を返すことができるようになる。関数の仮引数(関数定義の中の引数)の型に付けると実引数(実際に呼び出す際に渡す引数)に「null」を渡せるようになる。
上記のいずれも、データ型の名前の末尾に「?」を付けない場合は「null」の値をとることはできない。
オブジェクト変数は常に「null」が代入でき、そのオブジェクト変数から参照するオブジェクトを「なし」にできる。これをすると、それまで参照していたオブジェクトの参照カウンタを1減らし、そのオブジェクトが他から参照されていなければそこで破棄される。*1
文字列(string)型はオブジェクトなので常に「null」が代入できる。
関連記事:
参考URL:
- http://web.archive.org/web/20080222233546/www.gnome.gr.jp/docs/glib-2.8.x-refs/glib/glib-Basic-Types.html - GLibが提供する型について/バージョン2.8系日本語訳
- http://library.gnome.org/devel/glib/stable/glib-Basic-Types.html - GLibが提供する型について/最新安定版(英語)
- http://web.archive.org/web/20080322030231/www.gnome.gr.jp/docs/glib-2.8.x-refs/glib/glib-Limits-of-Basic-Types.html - 型ごとの値の上下限/バージョン2.8系日本語訳
- http://library.gnome.org/devel/glib/stable/glib-Limits-of-Basic-Types.html - 型ごとの値の上下限/最新安定版(英語)
*1:「null」でなく新しい別のオブジェクトを参照した場合にも最初に参照していたオブジェクトに対しては「null」を入れたのと同じように振舞う