gdbのptypeを使うのが簡単。
例えば、以下のfoo.c。
#include <sys/types.h> struct st { int i; char c; }; typedef int Array[10]; typedef struct st St; int main(void) { size_t s1; ssize_t s2; pid_t pid; Array arr; St st1; return 0; }
$ gcc -Wall -g -o foo foo.c $ gdb foo (gdb) b main (gdb) run (gdb) ptype s1 type = long unsigned int (gdb) ptype size_t type = long unsigned int (gdb) ptype s2 type = long int (gdb) ptype ssize_t type = long int (gdb) ptype pid type = int (gdb) ptype pid_t type = int (gdb) ptype arr type = int [10] (gdb) ptype Array type = int [10] (gdb) ptype st1 type = struct st { int i; char c; } (gdb) ptype St type = struct st { int i; char c; }
のように、
ptype 式や型名
で実際の型が表示される。
配列の場合はサイズが表示されるし、構造体の場合はメンバの型が表示されるので便利。
以下のように、gccの-Eオプションでプリプロセッサの出力調べても分かりそうだが、面倒くさいし、追い切れないかもしれない。
$ gcc -E foo.c | grep ssize_t typedef long int __ssize_t; typedef __ssize_t ssize_t; (以下略)
このシステム(x86_64 GNU/Linux)では、ssize_tは
__ssize_t => long int
$ gcc -E foo.c | grep ssize_t typedef long __darwin_ssize_t; (中略) typedef __darwin_ssize_t ssize_t; (以下略)
このシステム(Mac OS X)では、ssize_tは
ssize_t => __darwin_ssize_t => long
であることが分かる。