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

 

があった。定義消しているんだからそりゃ使えませんわと思った。