0

我在编译/链接一组类时遇到了一些麻烦,其中一些类处理一个公共的全局变量。

基本上,我在 A 类中声明并定义了一个外部变量 foo,并在 B 类和 C 类中访问/更新它。

相关代码如下所示:

extern string foo; // declare it <=== compiler error "storage class specified for foo"

B.cpp

include A.h  
string foo; // define it  

main () {   
...  
foo = "abc";      
}  

C.cpp

include A.h  
cout << foo; // print it  

我当前的错误是“为 foo 指定的存储类”。但是,我想知道这是否是正确的方法。我应该使用静态变量吗?任何帮助都非常感谢,因为我已经为此至少工作了一个小时。

4

8 回答 8

6

由于您的错误在外部,我猜它不知道类型是什么。

你有没有包括字符串?

#include <string>

如果是这样,你需要把std::它放在前面:

#include <string>
extern std::string foo;

旁注,确保你没有在你的头文件中使用任何using指令(using namespace stdusing std::string),因为这样你就会强迫每个起诉你的头文件的人都这样做,这是不好的做法。

编辑

...但这就是我对其进行编码的方式。

你确定吗?我刚刚尝试过,它在 VC++ 和 g++ 中都可以正常工作:

#include <string>

extern std::string foo;

B.cpp

#include "A.h"

std::string foo;

int main (void)
{   
    foo = "abc";      
}

C.cpp

#include "A.h"
#include <iostream>

int some_function(void)
{   
    std::cout << foo << std::endl;
}

试试看它是否有效。

于 2009-07-13T22:07:36.490 回答
4

在文件级别执行此操作。外部 main()

字符串 foo;

int main() {

}

否则它根本不是全局的,而是“自动”的

于 2009-07-13T21:49:10.053 回答
2

虽然 EFraim 的答案是正确的,但您的另一个问题是,这是否是正确的方法。答:不,在大多数情况下。

拥有一个由多个类操作的全局值只是在自找麻烦:使用extern非常微妙。对于查看定义变量的代码的任何程序员,都没有明确的提示。他/她必须进行完整的源扫描才能找到它。此外,很难确定哪个类何时更改应用程序控制流中的值,全局变量将不同的类与一个不可见的带联系在一起。一个好的设计使类之间的协作变得明确。

更好:让你的全局单例。通过这种方式,您至少知道值的定义位置,并且可以通过访问方法控制对值的更改。更好的是:找出类必须访问相同值的原因,找出哪个类取决于具体的哪个方面,并相应地修改您的设计。通常,使用extern只是解决更深层次的设计问题的快速解决方案。

于 2009-07-13T22:07:31.203 回答
2

在啊,您实际上在实际 A 类中得到了 extern 声明吗?您的问题目前用文字说明了这一点,但您的代码片段表明它处于文件级别。我能得到你正在谈论的错误的唯一方法,即“为 foo 指定的存储类”是 Ah 中的以下内容:

class A
{
public:
    extern std::string foo;
};

也许这是你的问题?

编辑:看看你自己的答案,我认为这就是你所做的。您想替换externstatic然后在 A.cpp 中使用类似的行定义该静态

std::string A::foo;

然后,您可以随后在其他地方访问它,A::foo例如。

std::cout << A::foo;
于 2009-07-13T23:07:34.280 回答
1

除了将定义移到 main 之外,请确保在 extern 声明之前包含字符串标题:

#include <string>
于 2009-07-13T22:01:59.107 回答
1

好吧,看起来 C++ 不允许您在除对象或函数之外的任何东西上使用“extern”:

来自http://publib.boulder.ibm.com/infocenter/comphelp/v8v101/index.jsp?topic=/com.ibm.xlcpp8a.doc/language/ref/extsc.htm

“C++ 将 extern 存储类说明符的使用限制为对象或函数的名称。将 extern 说明符与类型声明一起使用是非法的。extern 声明不能出现在类范围内。”

回到绘图板...

于 2009-07-13T22:18:12.523 回答
1

GMan 的回答是正确的:不包括字符串,您正在尝试实例化未定义的类型,因此会出现错误。

标准中引用的内容并不恰当:Jack 并未尝试将类型定义为静态,而是尝试实例化一个对象。

是的,你只能做类似的事情

class foo {
  // ...
  static int hoo; // class variable same in all instances of foo
  // ...
};

...但这不是杰克正在做的事情。

为什么我所有的代码都在这个 BBS 中被破坏了?上周提出了一个关于 C 指针的答案,当我想要单个的时,我用双星号结束了!

于 2009-07-13T22:27:05.377 回答
0

当你定义 foo 时,你是在函数 main 中定义一个局部变量。当你链接时,你会得到一个缺少的符号,因为你的 extern foo; 永远不会被创建。您需要在函数外部定义 foo 。

b.cpp

string foo;
int main () {
   foo = "abc";
}

更好的是,您应该尝试单例。

于 2009-07-13T22:00:27.037 回答