gpt4 book ai didi

c - 在 header 中声明结构使其成为全局结构

转载 作者:太空狗 更新时间:2023-10-29 15:43:47 24 4
gpt4 key购买 nike

一共有三个文件:source1.csource2.c标题.h

两个源文件都包含标题。

这是标题的代码:

struct
{
int a;
int b
} x;

现在发生的是结构变成了全局结构,两个源文件现在共享名为 x 的结构。为什么会这样?

我知道,如果您编写以下代码,它将创建两个全局变量。每个源文件一个。 (他们不共享全局变量)

int x = 0;

最后一段代码对我来说很有意义,但我真的不明白带有结构的代码..

编辑:
嗯这里的每个人都认为我应该得到链接器错误。我当前的代码用于嵌入式系统 (nxtOSEK)。稍后我会尝试将其转换为常规 C 程序。

编辑:
我回到了常规 C 中的示例。如您所见,它不仅可以用于结构,也可以用于常规变量。

源1.c

#include "header.h"

int main(void)
{
f();
x = 1;
f();
}

source2.c

#include "header.h"

void f()
{
printf("source2: %i\n", x);
}

标题.h

#include <stdio.h>

int x;

输出

source2: 0
source2: 1

请注意,不能声明 x 才能使其工作,否则它会像这里的每个人所说的那样给出链接器错误。 (我不知道为什么它与嵌入式系统一起工作..)

看起来我也误读了 Eric Postpischil 的答案,但看起来是正确的。

最佳答案

在文件范围内具有初始值设定项的对象标识符的外部声明是一个定义。声明 int x = 0; 是一个定义,因为 x 已初始化。

在文件范围内没有初始值设定项的对象标识符的外部声明是暂定定义。声明 struct {…} x; 是一个暂定定义,因为 x 没有被初始化。

链接时的多个定义会导致错误。

链接时的多个暂定定义合并为一个初始化为零的定义。

如果将 int x = 0; 更改为 int x;,则不会出现链接错误。如果将 struct {...} x; 更改为 struct {...} x = {0};,您将收到链接错误。

关于c - 在 header 中声明结构使其成为全局结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12644115/

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