Project_OKI’s diary

エンジニアの勉強ブログ

C言語基礎知識39(構造体、typedefを使う際の注意点)

構造体、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言語