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,因此编译器检查 a
和 func1
的定义(在 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。我欢迎对此解决方案提出更多意见。
我试图将局部变量(在 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,因此编译器检查a
和func1
的定义(在 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。我欢迎对此解决方案提出更多意见。