c言語のread,write関数の返り値はssize_t型でありssize_t型は32bitコンピュータではint型であり、64bitコンピュータではlong int型であることを確認していた。そのときインクルードファイルのbit/type.hには次の定義があった
#if __WORSIZE == 32
#define __STD_TYPE __extension__ typedef
#elif __WORSIZE == 64
#define __STD_TYPE typedef
__extension__の意味がわからなかったため簡単に調べた。
gccはコンパイルオプション -pedanticによって言語拡張機能をすべて無効にすることができる。gccの拡張機能は全く知らないので興味があったら調べる予定。
__extension__は拡張機能の無効によって発生する警告の出力を防ぐことができるらしい。
type.hは__STD_TYPE を使ってssize_tの型を定義している。ただし
__STD_TYPE ssize_t long int
ではなくtype.hで
__STD_TYPE __SSIZE_T_TYPE __ssize_t
と定義し別のヘッダファイルで
typedef ssize_t __ssize_t
と定義している。
time関数の返り値であるtime_t型なども同様にこの形で定義されている。
調べているときなぜかtypes.hをインクルードすればtypedefを__STD_TYPEで代用できるんじゃないかと思った。そこで試しにやってみた
#include <stdio.h>
#include <sys/types.h>
int main(){
__STD_TYPE double LFLOAT;
LFLOAT x;
printf("%d\n",sizeof(x));
return 0;
}
これで通ると思ってたがエラーが出る。なぜだろうと調べていたらtype.hの最後の方に
#undef __STD_TYPE
があった。定義消しているんだからそりゃ使えませんわと思った。