概要
複雑のプログラム作成や複数人で作成するプロジェクトで必ず
発生する。
ヘッダファイルの重複includeによるコンパイルエラー。
それの回避方法を記載します。
事象
発生の事象を下記にログを交えて説明します。
sigu@sigu-desktop:~/work/temp1$ fne=`ls *.[hc]`
sigu@sigu-desktop:~/work/temp1$ echo $fne
head1.h head2.h main.c
sigu@sigu-desktop:~/work/temp1$ for fn in $fne
> do
> echo $fn
> cat $fn
> done
head1.h
#define key1 1
#define key2 2
#include "head2.h" ←head1.hにhead2.hをincludeする。
head2.h
/* file取得用 */
struct file_ne { ←head2.h内に構造体を宣言する。
char filename[100];
};
main.c
#include <stdio.h>
#include "head1.h" ←mainソース内にhead1.hとhead2.hをincludeする
#include "head2.h"
int main()
{
struct file_ne fss ;
return 0;
}
sigu@sigu-desktop:~/work/temp1$
sigu@sigu-desktop:~/work/temp1$ gcc main.c ←コンパイルする
【下記に重複エラーが出力する】
In file included from main.c:3:0:
head2.h:3:8: error: redefinition of ‘struct file_ne’
struct file_ne {
^~~~~~~
In file included from head1.h:4:0,
from main.c:2:
head2.h:3:8: note: originally defined here
struct file_ne {
^~~~~~~
sigu@sigu-desktop:~/work/temp1$
修正方法
ヘッダファイルに下記のプリプロセッサを追加する
#ifndef ファイル名
#define ファイル名
【宣言等】
#endif
下記の様に実際には宣言します。
head2.h
#ifndef __HEAD2_H__
#define __HEAD2_H__
/* file取得用 */
struct file_ne {
char filename[100];
};
#endif
実際のログとなります。
sigu@sigu-desktop:~/work/temp1$ for fn in $fne; do echo $fn; cat $fn; done
head1.h
#ifndef __HEAD1_H__
#define __HEAD1_H__
#define key1 1
#define key2 2
#include "head2.h"
#endif
head2.h
#ifndef __HEAD2_H__
#define __HEAD2_H__
/* file取得用 */
struct file_ne {
char filename[100];
};
#endif
main.c
#include <stdio.h>
#include "head1.h"
#include "head2.h"
int main()
{
struct file_ne fss ;
return 0;
}
sigu@sigu-desktop:~/work/temp1$ gcc main.c
sigu@sigu-desktop:~/work/temp1$
コメント