Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 初始化标头中的静态变量_C_Variables_Static_Linker - Fatal编程技术网

C 初始化标头中的静态变量

C 初始化标头中的静态变量,c,variables,static,linker,C,Variables,Static,Linker,我是C语言编程新手,所以我尝试了很多不同的方法来熟悉C语言 我写了以下内容: 文件q7a.h: static int err_code = 3; void printErrCode(void); #include <stdio.h> #include "q7a.h" void printErrCode(void) { printf ("%d\n", err_code); } #include "q7a.h" int main(void) { e

我是C语言编程新手,所以我尝试了很多不同的方法来熟悉C语言

我写了以下内容:

文件q7a.h

static int err_code = 3;
void printErrCode(void);
#include <stdio.h>
#include "q7a.h"

void printErrCode(void)
{
        printf ("%d\n", err_code);
}
#include "q7a.h"

int main(void)
{
        err_code = 5;
        printErrCode();

        return 0;
}
文件q7a.c

static int err_code = 3;
void printErrCode(void);
#include <stdio.h>
#include "q7a.h"

void printErrCode(void)
{
        printf ("%d\n", err_code);
}
#include "q7a.h"

int main(void)
{
        err_code = 5;
        printErrCode();

        return 0;
}
然后我在makefile中运行了以下内容(我使用的是Linux操作系统)

输出为3

为什么会这样

如果您在头文件中初始化一个静态变量(事实上是任何变量),那么如果两个文件包含相同的头文件(在本例中是q7.c和q7main.c),那么链接器将给出定义两次相同变量的错误

为什么不将值5插入静态var(毕竟它是静态的和全局的)


感谢您的帮助。

static
意味着该变量仅在编译单元中使用,不会向链接器公开,因此,如果头文件中有一个
静态int
,并且包含在两个单独的.c文件中,则该int将有两个离散副本,这很可能根本不是你想要的


相反,您可以考虑<代码>外部INT/COD>,并选择一个实际上定义它的C文件(即只是代码> int ErryCal码=3 < /COD>)。静态变量不具有外部链接,这意味着它们不能在它们所定义的翻译单元之外访问。所以在你的例子中,当q7.h被包含在翻译单元q7a.c和q7main.c中时。。。相应的.o文件中存在两个不同的副本。这就是为什么链接器不报告错误,因为链接器在进行外部符号链接时看不到这两个副本。

在进行小规模研究时,我们知道可以在头文件中声明变量,但在其中一个源文件中包含该变量的定义

相反,如果我们在头文件中定义一个变量。在包含此头文件的源文件中,将创建定义,这将导致多个定义

静态变量应该在我们使用的文件中声明,它不应该暴露在头文件中


希望我提供的信息是正确的。如果我错了,请随意更正我在您的评论中的陈述。

当您将变量声明为静态变量时,它仅在文件中有作用域,即,只能在文件中访问它。 当您在头文件中声明一个静态变量并将此头文件包含在两个.c文件中时,您将创建两个不同的头文件 两个不同的“.c”文件的内存

当您直接在主函数中打印错误代码时,您会看到它的值为5,而不是3, 但您正在调用一个函数printErrCode,该函数在不同的文件“q7a.c”中定义,err_代码的内存位置不同 其中err_代码内存仍然是3,并且它没有更新,这就是为什么您得到的值是3而不是5


由于创建了两个内存,并且err_代码被视为两个不同的变量,具有不同的内存和不同的文件范围,因此您不会看到任何链接错误。

请注意:在任何情况下,都不要初始化头文件中的变量。这是绝对不正确的做法。我知道你现在做的是一个学习练习。@user82238,除非它是一个静态常量-那么可能吧。