C言語の小ネタ集
基本は、以下のAを行った後にBを行うことで、struct_instance1, struct_instance2 を利用できるようになる。
A. 構造体の型の定義
struct struct_type_name_t {
int16_t i16;
char c3[3];
};
B. その構造体の型を持つ変数/インスタンスの宣言
struct struct_type_name_t struct_instance1, struct_instance2;
AとBはまとめることができる。
AとBをまとめる場合
struct struct_type_name_t {
int16_t i16;
char c3[3];
} struct_instance1, struct_instance2;
また、この場合は、以下のように構造体の型の名前を省略できる。
struct {
int16_t i16;
char c3[3];
} struct_instance1, struct_instance2;
さらに、typedef を使うと別名への割り振りを行うことができる。
typedef の使い方
typedef old_name new_name;
そのため、Aに対して new_struct_type_name_t という名前を付けることができ、
typedef struct struct_type_name_t {
int16_t i16;
char c3[3];
} new_struct_type_name_t;
この場合についても、以下のように構造体の型の名前を省略できる。
typedef struct {
int16_t i16;
char c3[3];
} new_struct_type_name_t;
上記において構造体の型の名前はもはや new では無くなったので、new_ を取ると、
typedef を使う場合の構造体定義の最終形は以下のようになる。
typedef struct {
int16_t i16;
char c3[3];
} struct_type_name_t;
また、この場合の構造体の変数(インスタンス) struct_instance1, struct_instance2 は以下のように宣言することで、利用可能になる。
struct_type_name_t struct_instance1, struct_instance2;
宣言時
struct_type_name_t struct_instance1 = {16, "st"};
宣言時以外の場合は、構造体の型にキャストする。
struct_instance1 = (struct_type_name_t) {16, "st"};
ただし、構造体の要素やそれらの並びによっては構造体の中に隙間が生じることがあり、そこにメモリ上の値が入り外部へ漏洩するリスクが生じる場合もある。詳しくは「構造体 –漏洩させないための注意点–」をご参照下さい。