変更したヘッダーファイルの例をリスト5−7〜5−9に示します。これで、2重のヘッダーファ イルがなくなりました。
修正リスト | グローバル宣言 extern宣言 | |
---|---|---|
5−7 | defglb.h (5-1) + defglb.ext (5-2) | |
5−8 | dbstruct.h(5-3) + dbstruct.ext(5-4) | |
5−9 | mktable.c (5-5) + glbdata.ext (5-6) |
|
|
リスト5−8 dbstruct.h dbstruct.h(5-3) + dbstruct.ext(5-4) |
1 /****************************************************************/ 2 /* dbstruct.h グローバル変数の宣言 */ 3 /* */ 4 /* 91/8/31 変更 by fuji */ 5 /* dbstruct.h と dbstruct.ext で2重化されて */ 6 /* いたグローバル宣言を、このファイルに統合 */ 7 /* */ 8 /* 構造体およびそのメンバーの意味は分からないため、 */ 9 /* コメントは入れていません。 */ 10 /* */ 11 /****************************************************************/ 12 13 #ifndef DBSTRUCT_H_INCLUDED 14 #define DBSTRUCT_H_INCLUDED 15 16 #ifdef GLOBAL_VALUE_DEFINE 17 #define GLOBAL 18 #else 19 #define GLOBAL extern 20 #endif 21 22 struct SYSH{ 23 double FIG[5]; 24 unsigned char SBC; 25 unsigned short ATRIB[3]; 26 }; 27 28 GLOBAL short ssta; 29 30 GLOBAL struct { 31 short SUBNUM, MODE, INDEX, OFFSET, 32 GINDEX, GOFFSET, GHIDX, GHOFF, GPNO, GLEVEL, 33 COUNT, STS, OIDX, SVIDX, SVLEVEL, 34 WK[5]; 35 36 unsigned short ID, SUBID, 37 LAY, COL, L_TYPE, L_ARW, L_WIDE, 38 C_LEN, C_F1, C_F2, CO_BIT, 39 MSL, MARKN, MARKX, MARKY, 40 DSEL, STBL_ADR, 41 R_CT_SU, R_CF_SU, R_EF_SU, R_ET_SU, 42 Rcqmax, 43 USER, TAGS, 44 ZC_XP, ZC_YP, ZC_NUM; 45 46 double XPOS, YPOS, 47 ABSX, ABSY, 48 RLTX, RLTY, 49 PLRX, PLRY, 50 OPX, OPY, 51 GRID, 52 WTST[4], GPSUB[4]; 53 54 struct SYSH DATA; 55 } DAM; 56 57 GLOBAL short sea; 58 59 #undef GLOBAL 60 #undef GLOBAL_VAL 61 62 #endif 63 /********************************************************/ 64 /* EOF "dbstruct.h" */ 65 /********************************************************/ |
リスト5−9 data.h mktable.c (5-5) + glbdata.ext (5-6)のヘッダ部分 |
1 /****************************************************************/ 2 /* data.h グローバル変数の宣言 */ 3 /* */ 4 /* 91/8/31 変更 by fuji */ 5 /* glbdata.ext と mktable.c で2重化されていた */ 6 /* グローバル宣言を、このファイルに統合 */ 7 /****************************************************************/ 8 9 #ifndef DATA_H_INCLUDED 10 #define DATA_H_INCLUDED 11 12 #ifdef GLOBAL_VALUE_DEFINE 13 #define GLOBAL 14 #define GLOBAL_VAL(v) = (v) 15 #else 16 #define GLOBAL extern 17 #define GLOBAL_VAL(v) /* */ 18 #endif 19 20 GLOBAL short delng_flg GLOBAL_VAL(0); 21 GLOBAL short cmdng_flg GLOBAL_VAL(0); 22 23 GLOBAL struct { 24 double x; 25 double y; 26 double w; 27 double pst; 28 }Scale; 29 30 GLOBAL struct { 31 short col; 32 short no; 33 short id; 34 short subid; 35 short lay; 36 }cur_p; 37 38 GLOBAL short cur_col; 39 GLOBAL short cur_l_type; 40 41 GLOBAL struct line { 42 double sx; 43 double sy; 44 double ex; 45 double ey; 46 short arw; 47 } line, line2; 48 49 GLOBAL struct circle{ 50 double cx; 51 double cy; 52 double r; 53 double sang; 54 double eang; 55 } circ, circ2, enko; 56 57 58 GLOBAL short chrx_d GLOBAL_VAL(8); 59 GLOBAL short chry_d GLOBAL_VAL(16); 60 GLOBAL short crtbias GLOBAL_VAL(0); 61 62 63 GLOBAL short c_blink; 64 65 GLOBAL double c_grid; 66 67 GLOBAL short c_det; 68 69 GLOBAL short c_esc; 70 GLOBAL short CC; 71 GLOBAL short kpf; 72 73 /*-------- まだまだ続く、どこまでも --------*/ 74 75 #undef GLOBAL 76 #undef GLOBAL_VAL 77 78 #endif 79 /********************************************************/ 80 /* EOF "data.h" */ 81 /********************************************************/ |
各ヘッダーファイルの先頭には、
マクロ名は、ヘッダーファイルの名前に対応させています。この #ifndef により、すでにこの
ファイルを #include してしまったかどうかを判定しています。初回には、DETGLOBAL_H_INCLUDED
は、まだ #define されていないので、以下の行が読み込まれます。#ifndef の直後で、そのマク
ロ名を #define しているため、2回目以降にこのヘッダーファイルを #include しようとしても、
無視されてしまいます。したがって、何度も#includeで同一ヘッダーファイルを読み込もうとして
も、実際には1度だけしか読み込まれないので、2重定義のエラーは出ません。
プログラムがどんどん大きくなってくると、ヘッダーファイル中から、さらに他のヘッダーファ
イルを #include したくなるものです。この機構を備えていると、必要そうなヘッダーファイルは
何でも #include しても構わなくなります。この機構なしで、#include の #include をやりだす
と、もうパニックは確実です。
#ifndef DETGLOBAL_H_INCLUDED
#define DETGLOBAL_H_INCLUDED
のような記述があり、ファイルの最後に #ifndefに対応する #endif があります。
Copyright1996 Hirofumi Fujiwara. No reproduction or republication
without written permission
『Cプログラミング診断室』目次/
次(第5章 管理は複雑に バイト・オフセット)