初始化标头中的静态变量

我是C语言编程的新手,所以我尝试了许多不同的东西来尝试并熟悉语言。

我写了以下内容:

文件q7a.h

static int err_code = 3; void printErrCode(void); 

文件q7a.c

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

文件q7main.c

 #include "q7a.h" int main(void) { err_code = 5; printErrCode(); return 0; } 

然后我在makefile中运行以下命令(我使用的是Linux操作系统)

 gcc –Wall –c q7a.c –o q7a.o gcc –Wall –c q7main.c –o q7main.o gcc q7main.o q7a.o –o q7 

输出是3。

为什么会这样?

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

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

谢谢您的帮助。

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

相反,您可以考虑使用extern int ,并选择一个实际定义它的.c文件(即只是int err_code=3 )。

静态变量不具有外部链接,这意味着它们不能在定义它们的翻译单元之外访问。 所以在你的情况下,q7.h在翻译单元q7a.c和q7main.c中都是#include’ed …在它们相应的.o文件中存在两个不同的副本。 这就是链接器不报告错误的原因,因为链接器在执行外部符号链接时不会看到这两个副本。

虽然进行小型研究后才知道我们可以在Header文件中声明变量,但在其中一个源文件包含应该有该变量的定义。

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

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

希望我能提供正确的信息。 如果我错了,请随时在评论中纠正我的陈述。