Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/69.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 - Fatal编程技术网

在C语言中跨文件共享变量

在C语言中跨文件共享变量,c,C,我有两个文件: hudwidts.c 我遇到的问题是,当我试图编译它时,编译器抱怨没有定义buff,但当我试图定义它时,链接器抱怨两个buff变量。第二十二条军规。为此,我提出两个问题: 如何解决这个问题,以及 如果由于只需要分配一个变量(使用内存受限的微控制器),因此可以使用相同的变量从而节省内存 您需要在hud.c顶部使用此文件,以及从以下位置使用它们的任何其他.c文件: extern struct TextSize tsize; extern char buff[50]; extern关

我有两个文件:

hudwidts.c 我遇到的问题是,当我试图编译它时,编译器抱怨没有定义
buff
,但当我试图定义它时,链接器抱怨两个
buff
变量。第二十二条军规。为此,我提出两个问题:

  • 如何解决这个问题,以及

  • 如果由于只需要分配一个变量(使用内存受限的微控制器),因此可以使用相同的变量从而节省内存


  • 您需要在hud.c顶部使用此文件,以及从以下位置使用它们的任何其他.c文件:

    extern struct TextSize tsize;
    extern char buff[50];
    
    extern
    关键字告诉编译器“实际”变量已经存在于其他单元(文件)中,链接器最终会为您解决所有问题


    如果你在一个项目中大规模地做这件事,考虑你如何将全局包封装在一个地方,并创建一个共享的.h文件,声明这些东西对于你使用它们的所有地方都是“Extn”。

    < P>使用“ExtBuchBuff(50);”在你没有初始化Buff并想使用它的文件中。这说明声明是在其他文件中完成的,您正在该文件中使用它。

    其他c文件是什么意思?还有很多其他的。那么,我应该把它放在“main.c”或“hud.c”或“hudwidts.c”或其他什么地方吗?无论你在哪里使用这些变量。在上面的示例中,它是“hud.c”。但是,任何访问这些全局文件的文件,除了您在其中定义它们的实际文件之外,都需要将它们声明为“extern”。@Thomas如果所有这些
    .c
    文件都包含一个公共头,您可以将其放在那里。如果
    hudwidts.c
    也包含该文件,则可以将变量外部化,然后在同一个文件中声明它file@ThomasO:任何使用它的文件。通常,您会将extern声明放在所有这些文件都包含的头文件中。谢谢大家。回答正确;它起作用了。当它允许我(6分钟)时,我会将其标记为已接受的答案
    #include "hudwidgets.h"
    #include "hud.h"
    #include "osd.h"
    #include "osdadd.h"
    
    .. some code ..
    
    void hud_rc_plane_single_frame()
    {
        fill_mem(0x0000);
        if((frame / 50) % 2 == 0)
        {
            get_next_warning(buff);
        }
        .. some more code ..
    }
    
    extern struct TextSize tsize;
    extern char buff[50];