我是用C语言编程的新手,所以我尝试了许多不同的东西来尝试和熟悉这种语言。
我写了以下文章:
文件q7a.h
static int err_code = 3;
void printErrCode(void);
文件q7a.c
#include <stdio.h>
#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插入静态变量(毕竟它是静态的和全局的)?
谢谢你的帮助。
发布于 2010-10-01 08:17:46
static
意味着变量仅在编译单元中使用,不会暴露给链接器,因此如果在头文件中有一个static int
并从两个单独的.c文件中包含它,那么您将有两个独立的int副本,这很可能完全不是您想要的。
相反,您可以考虑extern int
,并选择一个实际定义它的.c文件(即只定义int err_code=3
)。
发布于 2019-09-09 15:39:26
当您将变量声明为静态时,它仅在文件(即.)中具有作用域,只能在文件中访问它。当您在头文件中声明一个静态变量并将此头文件包含在两个.c文件中时,您将为两个不同的".c“文件创建两个不同的内存。
当您在主函数中直接打印err_code时,您会看到它的值为5而不是3,但是您正在调用一个函数printErrCode,该函数定义在一个不同的文件"q7a.c“中,对于这个文件,err_code有一个不同的内存位置,其中err_code内存仍然是3,并且没有更新,这就是为什么要将值作为3而不是5来获得。
由于创建了两个内存,并且err_code被视为两个不同的变量,具有不同的内存和不同的文件范围,因此您将不会看到任何链接错误。
发布于 2010-10-01 15:19:33
静态变量没有外部链接,这意味着不能在定义它们的翻译单元之外访问它们。因此,在您的情况下,当q7.h是#包括‘’ed‘在两个翻译单位q7a.c和q7main.c .两个不同的副本存在于它们相应的.o文件中。这就是链接器不报告错误的原因,因为链接器在进行外部符号链接时看不到两个副本。
https://stackoverflow.com/questions/3837490
复制相似问题