【问题标题】:Can we declare, define & assign values to a variable and use those variables in another file?我们可以声明、定义和赋值给一个变量并在另一个文件中使用这些变量吗?
【发布时间】:2013-04-01 17:24:57
【问题描述】:

我是 C 编程的初学者,我正在尝试不同的方法并尝试使用小程序。

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

  1. 声明一个变量(实际上是两个变量和一个字符)和一个 函数(来自第二个源文件)在一个头文件中。
  2. 定义这些变量并在第二个标题中为它们赋值 文件(第 1 点的变量)。
  3. 编写一个包含这两个头文件并使用 这些文件中的值(第 2 点)在一个源文件中(没有主文件) 只是一个使用变量的函数定义)。
  4. 有一个从第二个调用函数的主源文件 源文件(从第 3 点开始。)

我怎么会这样?我在两个 .c 文件中都包含了两个头文件。但是当我尝试编译和链接它(在 Linux 中使用 GCC)时,我得到了一个 multiple definition ... first defined here 所有变量的错误。

我看过这些答案FirstSecond 我不太明白Second 中的答案,因为我无法弄清楚如何使用标题保护。 我不知道如何检查所有方框(第 1 点到第 4 点)。

header1.h

extern int i,j; extern char c;
void ad_d();

header2.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);
}

filemain.c

#include<stdio.h>
#include "header1.h"
#include "header2.h"



void main()
{

    ad_d();
}

【问题讨论】:

    标签: c header-files preprocessor-directive multiple-definition-error


    【解决方案1】:

    你只能定义一个变量,它会在内存中分配一个空间来存储值。然后,您可以在每个文件中声明变量(或者更好的是在公共头文件中),这将告诉编译器该名称和类型的变量将在一个编译文件中定义,并且可以在稍后阶段找到.

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

    int my_global = 0; /* always good practice to initalize */
    

    在其他文件(或通用头文件)中使用:

    extern int my_global;
    

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

    标题保护的东西是试图将定义和声明移动到同一个语句中,在你的水平上,你最好在尝试玩这样的游戏之前掌握声明与定义。

    【讨论】:

    • 根据您更新的问题,您不需要 header2.h。变量不应在标头中定义,因为标头可能只包含一次。简单地将 header2.h 中的定义放入 tghe c 文件的 eitehr(但不是两者)中。
    • 这将是消除错误的最简单方法。我试过了。但我只是想让事情尽可能复杂(通过以某种方式连接所有文件)以使我更好地理解。如果我保持 .h 文件的原样,有没有办法更改 .c 文件以避免错误? (这几乎是我希望做的)
    • 从其中一个 c 文件中删除 #include "second.h"
    【解决方案2】:
    int j=6;int i=7;
    char c='x';
    

    您不希望这些在头文件中,因为它们是定义。而是将它们放在 C 文件中,并在两个文件中包含相同的标头(使用变量的 extern 声明)。

    就目前而言,您的两个源文件都在尝试定义这些变量,这就是您收到错误的原因。

    【讨论】:

    • 所以你是说如果我将header2.h 更改为header2.c(当然添加stdio.h)它应该可以工作?
    • @ad3 不,只需将这些定义放在 fn2.c 而不是头文件中 - 你不需要 header2.h。
    猜你喜欢
    • 2022-01-09
    • 2020-07-27
    • 1970-01-01
    • 1970-01-01
    • 2016-02-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多