是 .h 文件中的变量全局变量

Are variables in .h file global variables

提问人:rachit juthani 提问时间:10/22/2023 最后编辑:HolyBlackCatrachit juthani 更新时间:10/27/2023 访问量:48

问:

有一个 tim.h 文件,其中包含 5 个 int 变量:int a;国际 b ;国际 C ;int d 国际 d ;int e; .我将tim.h包含在myfile.c文件中。

myfile.c 有 4 个函数: void func1();无效 func2();无效 func3() ;无效 func4();

现在我一开始就包括 tim.h。

现在 a,b,c,d,e 是否成为全局变量,如果我希望“a”仅是 func1() 的本地变量,我应该只在该函数中定义和声明“a”,而不是在 .h 文件中?

在文件之间获取多个声明错误。

c 链接 链接器错误

评论

3赞 Yksisarvinen 10/22/2023
请不要描述您的代码 - 以最小的可重现示例的形式显示它
1赞 pmg 10/22/2023
一般规则是不要在头文件中定义变量。如果必须引用它们,请使用 ;在单个源文件中定义变量。回答你的客观问题:是的,在函数内部定义一个局部变量(这个定义甚至可能掩盖以前的全局定义)。extern int a, b, c, d, e;.ca
1赞 BoP 10/22/2023
“在文件之间出现多个声明错误。”是的,如果将标头包含在多个 .c 文件中,则每个文件都会获得一个变量副本。

答:

0赞 DarkFranX 10/27/2023 #1

是的,对于包含标头的每个编译单元,它们都是独立的全局变量。

您收到多重声明错误,因为您将头文件包含在多个编译单元(或源 *.c 文件)中。每次在源文件中包含头文件时,变量 a、b、c、d、e 都会被实例化。因此,当各种编译单元都具有相同名称但不同的变量时,这会导致链接错误。

应尝试尽可能缩小变量范围。如果仅在 source1.c 的 func1() 中需要,则在 func1() 中声明为 .static 关键字将确保变量在 func1() 调用中保持其值,就好像它是全局变量一样:aastatic int a;

void func1(void)
{
    static int a;
    ...
}