2

複数の c ファイル間でアクセスできるようにしたい type-def の巨大な配列があります。type-def の定義はヘッダー ファイルにあります。データを共有するための最良の方法は何ですか..ヘッダーファイルまたはacファイルに保存する必要がありますか?

アプローチⅠ

project.h
---------
typedef struct td_myproject{
    lot of fields .... 
} td_myproject;

projectdata.h
-------------
include "project.h"

td_myproject myproject[] = {
    over 100k of recs with data filled before compilation
}

myproject.c
-----------
include "project.h"
include "projectdata.h"
(with proper guard usage)

print(%s",myproject[0].field1);

アプローチ 2

project.h
---------
typedef struct td_myproject{
    lot of fields .... 
} td_myproject;

projectdata.c
-------------
include "project.h"

td_myproject myproject[] = {
    over 100k of recs with data filled before compilation
}

myproject.c
-----------
include "project.h"
(with proper guard usage)

print(%s",myproject[0].field1);
4

2 に答える 2

3

個人的には、これは個人的な選択ですが、データ ( myproject[]) を独自の C ファイルに保存します。

なんで?

概念的には、ヘッダー ファイルは定数 (ストレージではなくコンパイルに使用) と定義用である必要があるためです。

一方、コード ファイルは、データとコードで構成されます。最終的に、コード ファイルはオブジェクト ファイルにコンパイルされ、リンカーはそれらのオブジェクト ファイル間の参照を結合します。コードとデータの両方が参照される項目であるため、論理的には、データが C ファイルにあり、それがオブジェクト ファイルになる場合、別のオブジェクト ファイル (C ファイルから) によって参照されます。

私にとって、ヘッダー ファイルに何かを入れることができるかどうかのテストは、2 つの別個の C ファイルがそのファイルをインクルードし、リンクできるかどうかです。この場合、静的変数をヘッダー ファイルに配置すると、2 つの異なる C ファイルに含まれているとリンケージが壊れます。

では、これにどのようにアプローチするのが最善でしょうか?

ヘッダファイルmyproject.h:

include "project.h"

/* define variable type, and the fact it needs to be linked in */
extern td_myproject myproject[];

コードファイルmyprojectdata.c:

#include "myproject.h"

/* actually define contents of variable in this unit */
td_myproject myproject[] = { ... };

myproject[]これの利点は、単にインクルードするだけで他の C ファイルから参照できることですmyproject.h

コードファイルmyproject.c:

#include "myproject.h"

int main( void ) {
    print("%s",myproject[0].field1);
}

リンク:

gcc -o myproject myproject.c myprojectdata.c
于 2013-07-04T08:23:03.920 に答える
0

最初のアプローチで私が目にするのは、ファイル myproject.c に両方の .h ファイルが含まれていることです。

include "project.h" include "projectdata.h"

ただし、「projectdata.h」には既に「project.h」が含まれているため、.c ファイルから「project.h」のインクルードのインスタンスを削除することをお勧めします。

そして approad II では、myproject.c が myproject[] が何であるかを知る方法。では、projectdata.c で既に宣言されているように、myproject[] を myproject.c で extern として宣言するのはどうですか?

于 2013-07-04T08:59:39.850 に答える