新しい型名
既存の型名に新しい名前をつける
C言語では、通常の型名 int や float などに新しい名前をつけることができます
この機能は、Cの標準ライブラリなどで多く使われているので知る必要があります
新しい名前をつけるにはtypedefキーワードを使用します
自己説明的な型名を作成したり、移植性の向上に使われるのが一般的です
typedef 既存の型名 新しい型名;
Cの型名には、もともと存在するC言語既存の型名を指定します
そして、新しい型名がその型につける新しい型名です
ここで注意してほしいのが名前を変えるわけではなく、別名を作成するだけということです
既存の名前が使えなくなるわけではありません
例としては、Microsoftのコンパイラのstdioヘッダファイルでは次の文があります
typedef unsigned int size_t;
筆者のVC++6.0で確認しています
size_tはもうわかっていますね。sizeof演算子が返す型です
#include <stdio.h>
typedef const char final;
typedef FILE stream;
typedef signed int Integer;
int main() {
final str[] = "Kitty on your lap";
stream *fp;
Integer i = 10;
return 0;
}
typedefの魅力はこれだけではありません
高度なプログラマになれば、より複雑な型をtypedefで指定することで
独自のライブラリをより自己説明的にカプセル化したりもできます
すでに私たちは高度なtypedefの恩恵を受けています
それがFILE構造体です
コンパイラによって記述方法は異なっていますが、多くは次のようになっています
typedef struct
{
unsigned char *curp; /* Current active pointer */
unsigned char *buffer; /* Data transfer buffer */
int level; /* fill/empty level of buffer */
int bsize; /* Buffer size */
unsigned short istemp; /* Temporary file indicator */
unsigned short flags; /* File status flags */
wchar_t hold; /* Ungetc char if no buffer */
char fd; /* File descriptor */
unsigned char token; /* Used for validity checking */
} FILE; /* This is the FILE object */
これは、Borland C++ Compiler 5.5のstdioヘッダファイルの一部です
FILE構造体型がtypedefによって定義されているのがわかりますね
MicrosoftのVC++も、少し書き方が違いますがほとんど同じことをやっています
#include <stdio.h>
#define true 1
#define false 0
typedef struct {
unsigned boolean: 1;
} BOOL;
int main() {
BOOL i;
i.boolean = true;
printf("%d" , i.boolean);
return 0;
}
このように、複雑なstructやenumなどの型にtypedefを指定することもできます
typedef type-declaration synonym;
指定したtype-declarationの同義語を作成します
synonymに型の別名を指定します
typedef 指定子は関数の宣言内では使えません