C言語関係掲示板

過去ログ

No.58. staticを含むソースの分割について


初めまして、こんにちは。
私は、下記のソースのようにカプセル化をして組んだりするのですが、この方法で組んで
いったときにソースの分割で困ってしまいました。
hoge.c が1000行を超えてしまってどうも見通しが悪いので、これを hoge_1.c と hoge_2.c
の2つに分割したいのですが、どうすればいいでしょうか?
分割すると別ソース側のprivate_func等が使えなくなってしまうので困ってます。
かといってstaticを外すとカプセル化が崩れてしまいます。
なにかいい方法はないものでしょうか?
--- hoge.h ---------
#ifndef __HOGE_H_INCLUDED
#define __HOGE_H_INCLUDED
extern void hoge_method1(void);
extern void hoge_method2(void);
#endif
--- hoge.c ---------
#include "hoge.h"
static int  private_var;
static void private_func1(void);
static void private_func2(void);
void hoge_method1(void)
{
        〜
}
void hoge_method2(void)
{
        〜
}
void private_func1(void)
{
        〜
}
void private_func2(void)
{
        〜
}
--------------------

最初に下記のような方法を考えたのですが、ステップ実行等でうまく表示できないのでやめました。
--- hoge.c ---------
#include "hoge.h"

#include "hoge_1.c"
#include "hoge_2.c"
--- hoge_1.c -------
static int  private_var;
static void private_func1(void);
static void private_func2(void);
void hoge_method1(void)
{
        〜
}
void hoge_method2(void)
{
        〜
}
void private_func1(void)
{
        〜
}
--- hoge_1.c -------
void private_func2(void)
{
        〜
}
--------------------


こんにちは、ともじです。

> 分割すると別ソース側のprivate_func等が使えなくなってしまうので困ってます。
> かといってstaticを外すとカプセル化が崩れてしまいます。
> なにかいい方法はないものでしょうか?

もともと、staticを付けた関数は内部リンケージを持ち、そのファイル内でのみ
使われるのが前提ですよね。ですから、staticを付けたまま別ファイルにするのは
無理があるのではないでしょうか。仮に、何か妙案があったとしても、一般的では
ないと思います。

それよりも、private_funcは同一ファイル内に置くようにし、モジュール分割を見直して、
externできる関数をくくりだし、別ファイルに持った方がいいのではないでしょうか。


すばやい返信ありがとうございます。

> それよりも、private_funcは同一ファイル内に置くようにし、モジュール分割を見直して、
> externできる関数をくくりだし、別ファイルに持った方がいいのではないでしょうか。

なるほど、単一モジュールでソースを分割するよりモジュール自体を分割したほうがいいということですね。
ソース分割ばかり考えてて頭がカチカチだったので目から鱗でした。
ありがとうございます。早速モジュールを分析しなおしてみます。

戻る


「初心者のためのポイント学習C言語」 Last modified:2001.10.7
Copyright(c) 2000-2002 TOMOJI All Rights Reserved