C:在文件之间传递变量

C: Passing variables between files

我试图将局部变量(在 func1 中)传递给另一个文件中的函数(func2),但 func2 要求将其作为全局变量。为了更好地解释事情,这里有两个文件:

file1.c:

#include <something.h>
extern void func2();
void func1(){
    int a=0;
    func2();
}

file2.c:

#include <something.h>
extern int a;  //this will fail
void func2(){
    printf("%d\n",a);
}

变量 int a 不能在 file1 中声明为全局变量,因为 func1 是递归调用的。有一个更好的方法吗?

在file1.c中:

#include <something.h>
#include "file1.h"

int a;

void func1(){
    a = 0;
}

在file1.h

extern int a;

在file2.c中:

#include <something.h>
#include "file1.h"

void func2(){
    printf("%d\n",a);
}

所以:

  • 变量在file1.c
  • file1.h让别人知道它存在并且它的类型是int。
  • file2.c 包括 file1.h 以便编译器在 file2.c 尝试使用它之前知道 var a 的存在。

抱歉,我无法评论 Ciro Pedrini 的回答,所以我会说:照他说的做,而且:

  • 明确 func1 的参数列表 (void) (并设置你的编译器抱怨空参数列表),因为 () 只是意味着你没有指定参数是什么,至少在 C 中,您的问题被标记为。
  • 在 file1.h 中声明 void func1(void); 以及 a
  • #include file1.h in file1.c,因此编译器检查 afunc1 的定义(在 file1.c 中)是否与其声明一致(在 file1.h).

但是,尽管您可能必须将此作为练习来执行,但请尽量避免在全局变量中传递信息:参数通常更可靠,因为更容易确保程序的其他部分不会更改它们。并且您谈到通过全局变量将信息传递给 递归 函数:在这种情况下,您必须特别小心地在递归调用之前获取并保存 func1 中的值更改值 - 传递参数变得更加容易和可靠!

如果我只使用 func1 一次,Ciro 的解决方案会奏效;然而 func1 被递归调用,所以变量 a 在 file1 中不能是全局的(即变量必须存在于堆栈而不是堆上)。这是我最终使用的解决方案:

File1.c:

#include <something.h>
extern void func2_new(int b);
void func1(){
    int a=0;
    func2_new(a);
}

File2.c:

#include <something.h>
int a;
void func2(){
    printf("%d\n",a);
}
void func2_new(int b){
    a=b;
    func2();
}

正如许多人指出的那样,唯一的答案是完全重构 func2。我欢迎对此解决方案提出更多意见。