C:在文件之间传递变量

时间:2015-05-05 00:52:02

标签: c scope global

我正在尝试将局部变量(在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是递归调用的。有一个更好的方法吗?

3 个答案:

答案 0 :(得分:2)

在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存在。

答案 1 :(得分:1)

抱歉,我无法对Ciro Pedrini的回答发表评论,所以我会说:按照他的说法做,但也是:

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

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

答案 2 :(得分:0)

如果我只使用一次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。我欢迎对此解决方案提供更多意见。