【问题标题】:variable between files [duplicate]文件之间的变量[重复]
【发布时间】:2012-10-29 14:00:03
【问题描述】:

可能重复:
How do I share variables between different .c files?

如果我有两个源文件和一个头文件:file1.c、file2.c 和 header.h,并且:

--header.h--

int i;

--file1.c--

#include <header.h>
i = 10;

int main() {
func();
return 0;
}

--file2.c--

#include <header.h>

void func() {
printf("i = %d\n", i);
return;
}

我收到i 默认为int 的警告。例如,如果我想将i 作为float,我该怎么办?

【问题讨论】:

  • 如果我将 i 声明为浮点数,我会收到“冲突类型”错误。
  • 您的i = 10 在任何函数之外,因此它永远不会被执行。相反,它被认为是缺少类型的变量定义,编译器会填写该类型。但是,要提出解决方案,我需要知道您要通过此实现什么。

标签: c


【解决方案1】:

做起来

extern int i;

在标题中和

int i = 10;

file1.c.

警告意味着对于file1.c 中的(不完整)声明i = 10;,应用了“隐式int”规则,特别是,该行被解释为声明(因为赋值不能出现在函数范围之外) .

【讨论】:

    【解决方案2】:

    您的代码中有几个错误。第一个是您在头文件中定义变量i,这意味着它将在包含头文件的所有源文件中定义。相反,您应该将变量声明extern:

    extern int i;
    

    另一个问题是您不能只分配给 file1.c 中全局范围内的变量。相反,您应该在那里定义变量:

    int i = 10;
    

    【讨论】:

      【解决方案3】:

      在标头中将其声明为extern(这意味着它的内存被保留在其他地方):

      /* header.h */
      extern int i;
      

      然后定义它只在一个.c文件中,即实际为它保留内存:

      /* file1.c */
      int i = <initial value>;
      

      【讨论】:

        【解决方案4】:
        1. 在标题中使用

          extern int i;

        2. file1.cfile2.c

          int i = 20;

        3. 如果您想要 float,只需将 int 更改为 float

        【讨论】:

          【解决方案5】:

          在 99.9% 的情况下,在文件之间共享非常量的全局变量是糟糕的程序设计。您真正需要这样做的情况很少:它们非常罕见,以至于我无法提出任何有效的案例。可能是硬件寄存器的声明。

          在大多数情况下,您应该使用(可能是内联的)setter/getter 函数(“public”)、文件范围内的静态变量(“private”)或不完整的类型实现(“private”)。

          在极少数情况下,当您需要在文件之间共享变量时,请执行以下操作:

          // file.h
          extern int my_var;
          
          // file.c
          #include "file.h"
          int my_var = something;
          
          // main.c
          #include "file.h"
          use(my_var);
          

          切勿将任何形式的变量定义放在 h 文件中。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-03-07
            • 2016-03-22
            • 1970-01-01
            • 2015-08-11
            • 2020-03-14
            相关资源
            最近更新 更多