gpt4 book ai didi

c - 从不同文件定义外部数组

转载 作者:太空狗 更新时间:2023-10-29 15:26:14 25 4
gpt4 key购买 nike

我正在声明一个结构数组,并希望在一个文件中定义第一个数组组件,在另一个文件中定义第二个数组组件。下面是一个例子。

header.h

struct st1 {
int a;
int b;
}

file1.c

struct st1 structure1[2];

我想使用来自不同文件的初始化 structure1 组件,如下所示

file2.c

extern struct st1 structure1[0] = { 10, 100 };

file3.c

extern struct st1 structure1[1] = { 200, 500 };

另请注意,在 file2.cfile3.c 中,定义不在函数内部。

如果我尝试编译,链接器会抛出多重定义错误。用谷歌搜索后,我知道 extern 的定义只能发生一次。我们可以在不同的源代码文件中完成这种extern数组的定义吗?

更多信息:file2.c 和 file3.c 有常量,我将在 file1.c 中使用它们。我当前的实现是在 file2.c 和 file3.c 中使用 init() 函数。 file1.c 使用初始化值来决定执行过程。由于 file2.c 和 file3.c 正在导出常量,我的意图是避免从 file1.c 进行 2 次额外的初始化调用。

最佳答案

我已尝试尽可能多地了解您的需求,我认为您需要像下面这样组织您的文件。

头文件将包含在整个项目中可用的共享符号引用以及一些函数:

////// header.h //////
struct st1 {
int a;
int b;
};

extern struct st1 structure1[2];

extern void init2();
extern void init3();

然后,包含符号的实现;您也可以在这里进行初始化:

////// file1.c //////
#include "header.h"

struct st1 structure1[2];

然后,您将在其中进行结构更改的代码文件;因为这不会在编译时发生,所以您需要将其包装在一个您将从其他地方调用的函数中。

////// file2.c //////
#include "header.h"

void init2()
{
structure1[0] = (struct st1){10, 100};
}

////// file3.c //////
#include "header.h"

void init3()
{
structure1[1] = (struct st1){200, 500};
}

以上两个脚本都有一个初始化函数,可以调用它来写入结构体。最后,一个演示行为的示例:

////// main.c //////
#include "header.h"
#include <stdio.h>

int main(void)
{
init2();
init3();

printf("s[0].a = %d, s[1].a = %d\n", structure1[0].a, structure1[1].a);

return 0;
}

这样编译:

cc -o file file1.c file2.c file3.c main.c

关于c - 从不同文件定义外部数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31065452/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com