構造体、typedefを使う際の注意点
この記事では、構造体、typedefを使う際の注意点ついて記載する。
typedefで置き換えたものを引数として使用する場合の注意点がある。
その注意点について記載する。
1. 目的
・typedefで置き換えたものや構造体を引数として使用する場合の注意点
目次
2. 注意点
・ヘッダファイルで、typedefで置き換えたものや構造体等を引数で使用する場合、
そのヘッダファイルは、関数を使う全てのファイルでインクルードする必要が出る。
・又はヘッダ側でファイルをインクルードする。
(基本的に、ヘッダファイルのインクルードはソースファイルで行う。
これは、ヘッダファイルにヘッダファイルをインクルードすると
そこで、結びつきができてしまい、バグの発生要因となるためである。
しかし今回の場合、その結びつきが絶対に必要な為、
例外的にヘッダファイルにヘッダファイルをインクルードすることもある。)
3. プログラムで確認
(1) signed intをtypedefで置き換えた場合
//main.cファイル /* typedefを使う際の注意点 sub.hのインクルードをコメントアウトすると、 Func2はエラーになる。 sub.hで引数にtypedefで作成したSINTが使用されており、 sub.hを使用する場合、先にtypedefをインクルードする必要がある。 Func1の方は、sub.hで使用していないため、sub.hだけで動作する。 */ #include <stdio.h> //#include "sub.h" //ここでインクルードするとFunc2がエラーする。 #include "typedef.h" #include "sub.h" int main(void){ Func1(); Func2(100); }
//typedef.hファイル typedef signed int SINT;
//sub.cファイル #include<stdio.h> #include "typedef.h" #include "sub.h" void Func1(){ SINT num; num = 10; printf("func1=%d\n",num); } void Func2(SINT num){ printf("func2=%d\n",num); }
//sub.hファイル extern void Func1(); extern void Func2(SINT num);
実行結果:https://paiza.io/projects/L9PX7QfdNTXHcCI-siD-YQ?language=c
(2) 構造体を引数に使用した場合
//main.c /* typedefを使う際の注意点 typedef.hのインクルードをコメントアウトすると、 Funcはエラーになる。 sub.hで引数に構造体が使用されている為、 sub.hをインクルードする場合は、事前にtypedef.hを インクルードしておく必要がある。 */ #include <stdio.h> #include "typedef.h" #include "sub.h" int main(void){ // Your code here! SETG setg; setg.setA = 200; setg.setB = 400; Func(setg); }
//typedef.hファイル typedef struct{ int setA; int setB; }SETG;
//sub.cファイル #include<stdio.h> #include "typedef.h" #include "sub.h" void Func(SETG setg){ printf("func_setg.setA=%d\n",setg.setA); printf("func_setg.setB=%d\n",setg.setB); }
//sub.hファイル extern void Func(SETG setg);
実行結果:https://paiza.io/projects/fmM_vF3zb5SE_eOpbusw_w
・上記のように、typedefや構造体を複数のファイルで使用する場合注意が必要。
・小規模であれば殆ど問題ないが、大きい規模になり、多くのファイルがあると
後々修正などが大変になる可能性がある。
構造体の関連記事:
・C言語基礎知識7(構造体1) - Project_OKI’s diary
・C言語基礎知識17(構造体とポインタとアロー演算子の使い方) - Project_OKI’s diary
・C言語基礎知識26(構造体の配列) - Project_OKI’s diary
・C言語基礎知識27(構造体を複数の別ファイルで使用する) - Project_OKI’s diary
・C言語基礎知識28(構造体の中で構造体を宣言する) - Project_OKI’s diary
※基本的な使い方は構造体と同じ為、他の使い方については構造体の記事を参照
関連記事
C言語:
・組み込みの為のC言語基礎知識1(printf) - Project_OKI’s diary
・C言語基礎知識2(for分で処理を繰り返す) - Project_OKI’s diary
・C言語基礎知識3(配列) - Project_OKI’s diary
・知らないと損するお金の話(ふるさと納税、確定申告とワンストップ納税どっちが得?) - Project_OKI’s diary
・STM32マイコン_2(UART通信:TeraTermにHellow表示) - Project_OKI’s diary
・STM32マイコン_3(UART通信:複数文字送信) - Project_OKI’s diary