2016-11-03 13 views
2

私は平均的なJavaスキルのC初心者です。ファイル間でCコードを正しく再利用する方法がわかりません。C - ファイル間のコード/メソッドの適切な再利用

はのは、私は2つのファイル/モジュールを持っているとしましょう:server.cclient.c

彼らは(GCCに)リンクされていないと、別のプロセスで実行する必要があります。

server.cには、client.cに使用したい2つの方法があります。これらのメソッドは、同じモジュール内でグローバル変数、静的変数(const)を使用します。基本的には、私は他のファイルにコピーするときと同じ機能を望みます。

小さな例:

server.c

static const char *progname = "server"; 

static int sockfd = -1; 
static int connfd = -1; 

static void free_resources(void) 
{ 
    if (sockfd >= 0) { 
     (void) close(sockfd); 
    } 

    if (connfd >= 0) { 
     (void) close(connfd); 
    } 
} 

client.c

static const char *progname = "client"; 

static int sockfd = -1; 
static int connfd = -1; 

// I want to use free_resources here 

私はclient.cで同じ方法を使用したい場合は、何がそれを行うための正しい方法でしょうか?

この方法で個別のutil.c/util.hモジュールを作成した場合、どのようにグローバル変数にアクセスできますか?私はそれらを毎回議論として渡すべきですか?静的を削除しますか?

Javaでは、おそらくクラスを作成してグローバル変数への参照を一度渡します。 Cにも同様のアプローチがありますか?私はおそらくクラスを作成しますJavaでは

+0

「私はグローバル変数へのアクセス方法」(機能は外あるutils.cから呼び出し可能でなければならないので、あなたは、staticキーワードを使用できないことに注意してください)。この文脈で「私」は誰ですか? – kaylum

+0

@kaylum server.cとclient.cにインクルードするユーティリティモジュール(?)util.cです。 – MWin123

+0

しかし、これらの変数はおそらくutil.cにもあります。したがって、そのファイル内のどの関数もそれらのファイルにアクセスできます。代わりにあなたは何をしようとしましたか?ファイル外の変数にアクセスする必要がある場合は、そのファイル内のいずれかのAPIを返すようにします。 – kaylum

答えて

1

...

Cにおける同等の構造体を作成し、変数へのアクセスを必要とする任意の関数に構造体へのポインタを渡すことです。構造体の宣言はutils.hになければなりません。

typedef struct 
{ 
    char *progname; 
    int sockfd; 
    int connfd; 
} 
Info; 

void free_resources(Info *info); 

server.cとclient.cの構造体を作成して初期化し、そのアドレスを共通関数に渡します。

Info server_info = { "server", -1, -1 }; 

int main(void) 
{ 
    // ... 

    free_resources(&server_info); 
} 

次に、utils.cのコードは次のようになります。

void free_resources(Info *info) 
{ 
    if (info->sockfd >= 0) { 
     (void) close(info->sockfd); 
    } 

    if (info->connfd >= 0) { 
     (void) close(info->connfd); 
    } 
} 
+0

ありがとうございます。これは、https://stackoverflow.com/questions/40412265/c-proper-reuse-of-code-methods-between-files#comment68074914_40412265などの外部変数を使用する場合とどのように比較されますか? – MWin123

+1

@ MWin123主な違いは2つあります。 1)この構造を使用することにより、名前空間汚染が軽減される。 'sockfd'という名前の構造体は' sockfd'という局所変数と決して衝突しません。なぜなら、前者はグローバル名前空間ではなく構造体名前空間にあるからです。 2)クラスの複数のインスタンスを持つことができるのとまったく同じ方法で、構造のインスタンスを複数持つことができます。あなたはおそらくこれを必要としないでしょうが、将来は分かりません。 – user3386109

関連する問題