人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

c言語 ヘッダ整理 extern宣言とprototype宣言の重複防止
c言語のソースファイルとヘッダファイルにおいて、
インクルード時にextern宣言とprototype宣言の重複防止しながらもカッチョよくスッキリサッパリ整理する方法についてお知恵を拝借したく。

ファイル構成としては現状こんな感じです。

main.c <== 関数 main() から各関数をCallする。
xx01.c <== 関数 xx01_func1()、xx01_func2()…の実体とprototype宣言
xx01.h <== 上記のextern宣言
xx02.c <== 関数 xx02_func1()、xx02_func2()…の実体とprototype宣言
xx02.h <== 上記のextern宣言



考え方としては、以下3点
1)グローバルに参照したいもの(extern宣言)はhにまとめて、みんなでインクルードする
2)ユニークであるべきもの(prototype宣言)は実体と共にある
3)extern宣言とprototype宣言は重複しないようにすべし

ここで、3)を実現する方法について、悩んでおります。

●質問者: GM91
●カテゴリ:コンピュータ 学習・教育
○ 状態 :終了
└ 回答数 : 2/2件

▽最新の回答へ

質問者から

==補足==
//xx01.h の内容は以下の通り。

#ifndef _X01_EXT
#define _X01_EXT

extern void xx01_func1(void); /* 実体とプロトタイプ宣言は xx01.c に記載 */
extern void xx01_func2(void); /* 実体とプロトタイプ宣言は xx01.c に記載 */
extern void xx01_func3(void); /* 実体とプロトタイプ宣言は xx01.c に記載 */
extern void xx01_func4(void); /* 実体とプロトタイプ宣言は xx01.c に記載 */

#endif


//xx02.h の内容は以下の通り。
#ifndef _X02_EXT
#define _X02_EXT

extern void xx02_func1(void); /* 実体とプロトタイプ宣言は xx02.c に記載 */
extern void xx02_func2(void); /* 実体とプロトタイプ宣言は xx02.c に記載 */
extern void xx02_func3(void); /* 実体とプロトタイプ宣言は xx02.c に記載 */
extern void xx02_func4(void); /* 実体とプロトタイプ宣言は xx02.c に記載 */

#endif

: 以下 xx75.hまで 同様。

ここで、各々の .cファイルから、すべての.hファイルをインクルードしようとすると
#include "xx01.h"
#include "xx02.h"
:
:
#include "xx75.h"

となるが、この部分を更に allinc.h というヘッダファイルにしてしまって
各 .cファイルからは、冒頭で
#include "allinc.h"

としてしまえば楽ちんかな、と思った。
ですが、この場合、例えば
xx01.c 内で定義している関数のprototypeが、インクルードしたextern宣言と重複してしまうことになります。

#ifndef をうまく使って 実体を定義したファイルに限っては重複するexternを無効にするようにできるのではないかと思うのですが、詳しい方教えていただけないでしょうか。

もしくは、そもそもそんな構造にしなくても、こうすればいいよ的なご提案でもOKです。
うまくやれば、extern宣言とprototype宣言を一つのhにまとめたりできるのでは?
とかも考えてみたりしてますが、ちょっと混乱してきた… <(*_*<

何卒宜しくお願い致します。


1 ● pogpi
ベストアンサー

#define _X01_EXT

を、xx01.cファイルの

#include "allinc.h"

の前に書くのは、どうですか。2以降も同様に。


GM91さんのコメント
最初考えていたのはそういうイメージでした。ありがとうございました。

2 ● JULY

こんな感じかなぁ。

#ifdef __XX01_C
#define _EXTERN
#else
#define _EXTERN extern
#endif

_EXTERN void xx01_func1(void);
_EXTERN void xx01_func2(void);

#define __XX01_C
#include "xx01.h"

ただ、Linux 上のヘッダファイルとかをちらっとみた感じだと、プロトタイプ宣言に extern を付けないのが普通ですね。


GM91さんのコメント
たしかに extern自体を #define 定義する手もありますね。 ありがとうございます。
関連質問

●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ