Sam*_*sen 3 c struct global header
有三个文件:source1.c source2.c header.h
两个源文件包括标头.
这是标题的代码:
struct
{
int a;
int b
} x;
Run Code Online (Sandbox Code Playgroud)
现在发生的是结构变为全局,两个源文件现在共享名为x的结构.为什么会这样?
我知道如果你编写以下代码,它将产生两个全局变量.每个源文件一个.(他们不共享全局变量)
int x = 0;
Run Code Online (Sandbox Code Playgroud)
最后一段代码对我有意义,但我真的不理解结构的那一段.
编辑:
嗯这里的每个人都认为我应该得到链接器错误.我目前的代码是针对嵌入式系统(nxtOSEK).我稍后会尝试将其转换为常规C程序.
EDITEDIT:
我回来了常规C中的例子.正如你所看到的那样,不仅可以使用结构,还可以使用常规变量.
source1.c
#include "header.h"
int main(void)
{
f();
x = 1;
f();
}
Run Code Online (Sandbox Code Playgroud)
source2.c
#include "header.h"
void f()
{
printf("source2: %i\n", x);
}
Run Code Online (Sandbox Code Playgroud)
header.h
#include <stdio.h>
int x;
Run Code Online (Sandbox Code Playgroud)
产量
source2: 0
source2: 1
Run Code Online (Sandbox Code Playgroud)
请注意,不得声明x使其工作,否则会产生链接器错误,就像这里所说的每个人一样.(我不知道为什么它与嵌入式系统一起工作..)
看起来我也误读了Eric Postpischil的答案看起来是正确的.
Eri*_*hil 10
具有初始值设定项的文件范围内的对象标识符的外部声明是一个定义.声明int x = 0;是一个定义因为x已初始化.
文件范围内没有初始化程序的对象标识符的外部声明是暂定定义.声明struct {…} x;是一个暂定的定义,因为x没有初始化.
链接时的多个定义会导致错误.
链接时的多个暂定定义合并为单个定义,该定义用零初始化.
如果更改int x = 0;为int x;,则不会出现链接错误.如果更改struct {…} x;为struct {…} x = {0};,则会出现链接错误.
下面的代码段
struct
{
int a;
int b;
} x;
Run Code Online (Sandbox Code Playgroud)
声明没有标记x的类型struct变量.对于计划在单个编译单元中使用的静态结构,这是可以的,但如果您计划struct在多个.c文件中共享,则不应该这样做.相反,您应该为您定义标记struct或为其创建标记typedef,并使用srtruct my_struct语法分别声明该类型的变量.
这是一个例子:
将此struct声明放在标题中:
struct a_and_b
{
int a;
int b;
};
Run Code Online (Sandbox Code Playgroud)
将此变量声明放在.c文件中:
static struct a_and_b x;
Run Code Online (Sandbox Code Playgroud)
现在x不再是全局的:您可以在.c文件中访问它,但从外部看不到它.如果要使其全局化,但避免链接器错误,请添加
extern struct a_and_b x;
Run Code Online (Sandbox Code Playgroud)
到标题,并static从.c文件中的声明中删除.