操纵全局变量

时间:2011-05-16 17:00:59

标签: c++ header global-variables

我在两个(链接的)C ++文件中都有函数,它们都使用相同的变量。对我来说(一个完整的初学者)我可以看到两种处理方式:

  1. 将变量从第一个函数传递给第二个函数(它们在程序中是顺序的),或者

  2. 将变量定义为单独的头文件中的全局值,两个c ++文件都包含在开头

  3. 虽然(1)似乎是最明显的答案,但我选择使用2.无论出于何种原因。

    无论如何,变量现在在标题中声明,但是如果我在声明时尝试为变量赋值,我会得到错误“(value)已在main.obj中定义”。

    标头包含在两个C ++文件的开头。该变量未在其他任何地方声明,但使用它。

    必须有一个明显的答案,但我对C ++很新。任何能够解释为什么我不能为变量赋值的人都会非常感激。

4 个答案:

答案 0 :(得分:2)

答案 1 :(得分:2)

由于您在标题中声明了变量,然后将标题包含在两个单独的文件中,您最终会在两个位置定义相同的变量。
可能的方式或组织它们可以是:

myList.h

class list { ....};  

file1.cpp

#include "myList.h"
list * x ;

file2.cpp

#include "myList.h"
extern list * x;  

答案 2 :(得分:1)

虽然您可以解决如何使用全局的问题,但如果您完全避免使用它会更好。如果您有两个修改单个变量的函数,那么您可以做的最简单的事情是将变量作为参数传递给函数:

void foo( type & var );
void bar( type & var );
int main() {
   type t( constructor_argument );   // [1]
   // [2] operate on t before calling the functions
   foo( t );
   // [3] operate some more if needed
   bar( t );
   // [4] t now has been updated by both foo and bar
}

如果不需要在第一个函数([1]不需要,并且[2]不存在)之前构造变量,那么您可以将该变量作为函数的返回值:< / p>

type foo(); // create and return the variable
void bar( type& );
int main() {
   type t = foo();
   // [3] operate on t
   bar( t );
   // [4] use the final t
}

如果在调用第一个函数后不需要更新变量,并且第二个函数实际上没有修改变量(它只读取第一个函数的内容),那么{{1}中不需要变量在第二个函数执行(main为空)之后,您可以更改第二个函数签名并完全避免[4]中的变量:

main

这里显示的不同问题的任何和所有解决方案都比拥有不同功能使用的全局变量要好得多。当您读取type foo(); void bar( type ); int main() { bar( foo() ); } 中的代码(或具有逻辑的任何函数)时,很明显数据是如何从一个点流向另一个点的。对于全局变量,在调用main之前调用foo的需要在代码中并不明确,除非您阅读函数的实现,否则将隐藏对全局的依赖。

尽可能避免全局变量,它会使您的代码更易于维护,更容易推理并更容易测试。

答案 3 :(得分:0)

使用这两个函数(可以添加更多函数)和成员变量创建一个类。在C ++中使用全局变量是usually considered as bad practice