『Cプログラミング診断室』目次次(第5章 管理は複雑に バイト・オフセット)

第5章 管理は複雑に

修正例


変更したヘッダーファイルの例をリスト5−7〜5−9に示します。これで、2重のヘッダーファ イルがなくなりました。

▼続きがあります。

表5−2 修正版ヘッダーファイルリスト一覧
修正リストグローバル宣言  extern宣言
5−7defglb.h (5-1) + defglb.ext (5-2)
5−8dbstruct.h(5-3) + dbstruct.ext(5-4)
5−9mktable.c (5-5) + glbdata.ext (5-6)

 
リスト5−7 defglb.h  defglb.h (5-1) + defglb.ext (5-2)

     1	/****************************************************************/
     2	/*      defglobal.h     グローバル変数の宣言                    */
     3	/*                                                              */
     4	/*      91/8/31 変更    by fuji                                 */
     5	/*              defglb.h と defglb.ext で2重化されていた       */
     6	/*              グローバル宣言を、このファイルに統合            */
     7	/*                                                              */
     8	/*      変数の意味は分からないため、コメントは入れていません。  */
     9	/*                                                              */
    10	/****************************************************************/
    11	
    12	#ifndef DETGLOBAL_H_INCLUDED
    13	#define DETGLOBAL_H_INCLUDED
    14	
    15	#ifdef  GLOBAL_VALUE_DEFINE
    16	#define GLOBAL
    17	#else
    18	#define GLOBAL  extern
    19	#endif
    20	
    21	GLOBAL double   G_TANTEN[8][2],
    22	                G_ALLOW,
    23	                G_MARKCOU,
    24	                G_XCUR,G_YCUR,
    25	                G_XMARK[21],
    26	                G_YMARK[21],
    27	                G_XABS,G_YABS,
    28	                G_XRLT,G_YRLT,
    29	                G_XPLR,G_YPLR,
    30	                G_XWAKU1,G_XWAKU2,
    31	                G_YWAKU1,G_YWAKU2,
    32	                G_XFIND,G_YFIND,
    33	                FIG[5],
    34	                *G_ZCX,
    35	                *G_ZCY,
    36	                GH_FIG[6];
    37	
    38	GLOBAL short    G_YOSO,G_COLOR,G_SENSHU,G_LAYER,
    39	                G_TNTN_IDX,G_YOSO_IDX,
    40	                G_COUNT,
    41	                TREQMD,
    42	                G_R_STS,
    43	                *G_BUF;
    44	
    45	GLOBAL  short   SV_HEAD;
    46	
    47	#undef  GLOBAL
    48	#undef  GLOBAL_VAL
    49	
    50	#endif
    51	/********************************************************/
    52	/*                EOF        "detglobal.h"           */
    53	/********************************************************/


我輩は猫である


 
リスト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	DETGLOBAL_H_INCLUDED
	#define	DETGLOBAL_H_INCLUDED
のような記述があり、ファイルの最後に #ifndefに対応する #endif があります。

マクロ名は、ヘッダーファイルの名前に対応させています。この #ifndef により、すでにこの ファイルを #include してしまったかどうかを判定しています。初回には、DETGLOBAL_H_INCLUDED は、まだ #define されていないので、以下の行が読み込まれます。#ifndef の直後で、そのマク ロ名を #define しているため、2回目以降にこのヘッダーファイルを #include しようとしても、 無視されてしまいます。したがって、何度も#includeで同一ヘッダーファイルを読み込もうとして も、実際には1度だけしか読み込まれないので、2重定義のエラーは出ません。

プログラムがどんどん大きくなってくると、ヘッダーファイル中から、さらに他のヘッダーファ イルを #include したくなるものです。この機構を備えていると、必要そうなヘッダーファイルは 何でも #include しても構わなくなります。この機構なしで、#include の #include をやりだす と、もうパニックは確実です。


Copyright1996 Hirofumi Fujiwara. No reproduction or republication without written permission
『Cプログラミング診断室』
目次次(第5章 管理は複雑に バイト・オフセット)