C 我们是否可以声明、定义&;为一个变量赋值并在另一个文件中使用这些变量?

C 我们是否可以声明、定义&;为一个变量赋值并在另一个文件中使用这些变量?,c,header-files,preprocessor-directive,multiple-definition-error,C,Header Files,Preprocessor Directive,Multiple Definition Error,我是C编程的初学者,我正在尝试不同的方法,并用小程序进行实验 我有四个文件。两个头文件和两个源文件。我想: 声明一个变量(实际上是两个变量和一个字符)和 函数(来自第二个源文件)在一个头文件中 定义这些变量并在第二个标题中为其赋值 文件(来自点1的变量) 编写一个包含这两个头文件的函数,并使用 这些文件(第2点)中的值在一个源文件(不带主文件)中- 只是使用变量的函数定义) 有一个从第二个调用函数的主源文件 源文件(从第3点开始) 我该怎么做?我已将这两个头文件都包含在.c文件中。但是当我尝试编

我是C编程的初学者,我正在尝试不同的方法,并用小程序进行实验

我有四个文件。两个头文件和两个源文件。我想:

  • 声明一个变量(实际上是两个变量和一个字符)和 函数(来自第二个源文件)在一个头文件中
  • 定义这些变量并在第二个标题中为其赋值 文件(来自点1的变量)
  • 编写一个包含这两个头文件的函数,并使用 这些文件(第2点)中的值在一个源文件(不带主文件)中- 只是使用变量的函数定义)
  • 有一个从第二个调用函数的主源文件 源文件(从第3点开始)
  • 我该怎么做?我已将这两个头文件都包含在.c文件中。但是当我尝试编译和链接它(在Linux中使用GCC)时,我得到了一个
    多重定义。。。首先在此处定义所有变量的
    错误

    我已经看过这些答案,并且 我不太明白这个问题的答案,因为我不知道如何使用头球护卫。 我不知道如何勾选所有框(第1点到第4点)

    校长1.h

    extern int i,j; extern char c;
    void ad_d();
    
    校长2.h

    int j=6;int i=7;
    char c='x';
    
    fnfile.c

    #include "header1.h"
    #include "header2.h"
    #include<stdio.h>
    
    void ad_d()
    {
    
        i+=j;
    
        printf("\n %d \t %c \n", i,c);
    }
    
    #包括“header1.h”
    #包括“header2.h”
    #包括
    无效ad_d()
    {
    i+=j;
    printf(“\n%d\t%c\n”,i,c);
    }
    
    filemain.c

    #include<stdio.h>
    #include "header1.h"
    #include "header2.h"
    
    
    
    void main()
    {
    
        ad_d();
    }
    
    #包括
    #包括“header1.h”
    #包括“header2.h”
    void main()
    {
    ad_d();
    }
    
    您只能定义一次变量,该变量将占用内存中存储该值的空间。然后,您可以在每个文件(或者更好的是在公共头文件)中声明变量,这将告诉编译器该名称和类型的变量将在其中一个编译文件中定义,并且可以在以后的阶段找到

    在要定义变量用途的文件中:

    int my_global = 0; /* always good practice to initalize */
    
    在其他文件(或公共标题)中,请使用:

    现在,您可以从声明my_global的任何文件中读取或写入my_global

    header guard是一种试图将定义和声明移动到同一个语句中的方法,在您的级别上,在尝试玩类似的游戏之前,最好先处理声明和定义

    int j=6;int i=7;
    char c='x';
    
    您不希望将它们放在头文件中,因为它们是定义。将它们放在C文件中,只在两个文件中包含相同的头(使用变量的
    extern
    声明)


    目前,您的两个源文件都试图定义这些变量,这就是为什么会出现错误。

    根据您更新的问题,您不需要header2.h。不应在标头中定义变量,因为标头可能只包含一次。simple将header2.h中的定义放入tghe c文件的eitehr(但不是两者)中。这是消除错误的最简单方法。我试过了。但我只是想让事情变得尽可能复杂(通过某种方式连接所有文件),以便更好地理解。如果我保持.h文件的原样,有没有办法更改.c文件以避免错误?(这正是我希望做的)从一个c文件中删除#include“second.h”,所以你是说如果我将
    header2.h
    更改为
    header2.c
    (当然添加
    stdio.h
    ),它应该可以工作?@ad3不,只需将这些定义放在fn2.c中,而不是头文件中-你不需要header2.h。
    int j=6;int i=7;
    char c='x';