我在两个(链接的)C++文件中都有函数,它们都使用相同的变量。对我来说(一个完整的初学者),我可以看到两种处理方法:
-
将变量从第一个函数传递到第二个函数(它们在程序中是顺序的),或者
-
将变量定义为单独头文件中的全局值,两个 c++ 文件都包含在开头
虽然(1)似乎是最明显的答案,但我选择使用2。无论出于何种原因。
无论如何,变量现在在标头中声明,但是如果我尝试在声明时为变量赋值,则会出现错误"(值)已在main.obj中定义"。
标头包含在两个C++文件的开头。该变量未在其他任何地方声明,但会使用。
对此必须有一个显而易见的答案,但我对C++很陌生。任何可以阐明为什么我不能为变量分配值的人,我将不胜感激。
使用 extern
: http://bobobobo.wordpress.com/2009/06/04/understanding-extern-variables-in-c/
由于您在标头中声明了变量,然后将标头包含在两个单独的文件中,因此最终会在两个位置定义相同的变量。
一种可能的方法或组织它们可能是:
myList.h
class list { ....};
文件1.cpp
#include "myList.h"
list * x ;
文件2.cpp
#include "myList.h"
extern list * x;
虽然您可以解决如何使用全局的问题,但完全避免它会好得多。如果您有两个修改单个变量的函数,那么您可以做的最简单的事情就是将变量作为参数传递给函数:
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]
不存在),那么您可以将该变量作为函数的返回值:
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
}
如果在调用第一个函数后不需要更新变量,并且第二个函数实际上并没有修改变量(它只读取第一个函数所做的事情),并且在第二个函数执行后main
中不需要该变量([4]
为空),那么您可以更改第二个函数签名并完全避免main
中的变量:
type foo();
void bar( type );
int main() {
bar( foo() );
}
这里显示的不同问题的任何和所有解决方案都比使用由不同函数使用的全局变量要好得多。当您读取main
(或任何具有逻辑的函数)中的代码时,数据如何从一个点流向另一个点是显而易见的。对于全局变量,在调用bar
之前调用foo
的需求在代码中没有明确,除非读取函数的实现,否则对全局的依赖是隐藏的。
尽可能避免全局变量,这将使您的代码更易于维护,更容易推理和测试。
创建一个包含这两个函数(您可以添加更多函数)和成员变量的类。在C++中使用全局变量通常被认为是不好的做法。