2

我有一个庞大的 type-def 数组,我希望它可以跨多个 c 文件访问。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);

方法二

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 文件)引用。

对我来说,是否可以进入头文件的测试是两个单独的 C 文件是否可以包含该文件并仍然链接。在这种情况下 - 如果将静态变量包含在两个不同的 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[]通过仅包含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 文件,其中

包括“project.h” 包括“projectdata.h”

但是您的“projectdata.h”已经包含“project.h”,因此您可能希望从 .c 文件中删除包含“project.h”的实例。

在 approad II 中,myproject.c 如何知道 myproject[] 是什么。那么如何在 myproject.c 中将 myproject[] 声明为 extern,因为它已在 projectdata.c 中声明?

于 2013-07-04T08:59:39.850 回答