我有以下两个示例c ++文件:
档案:foo.cc
namespace test_ns {
int x = 100;
}
文件:bar.cc
using namespace test_ns;
extern int x;
int main()
{
x = 200;
return 0;
}
我必须做一些非常愚蠢的事情,因为我收到以下编译错误:
bar.cc:2:17:错误:'test_ns'不是命名空间名称
bar.cc:2:24:错误:';'之前的预期命名空间名称令牌
但是,我的主要问题(在我解决命名空间错误之后),使用代码,我应该能够在bar.cc中使用“x”,还是需要使用其他限定符。
很抱歉打扰这么简单的问题,但我对这么简单的程序感到非常难过。
谢谢你, 艾哈迈德。
答案 0 :(得分:3)
就像C ++中的每个其他名称一样,必须先声明名称空间名称才能访问它。在编译bar.cc
时,编译器不知道test_ns
是名称空间名称 - 您还没有为其提供声明。
命名空间和using namespace
不是神奇的技巧,让您可以解决声明要使用的任何内容的必要性。要使其工作,请创建一个头文件:
<强> foo.hh 强>
namespace test_ns {
extern int x;
}
然后在#include "foo.hh"
中bar.cc
,然后从extern int x;
移除bar.cc
。这将使这两个翻译单元形成一个有效的程序。在您这样做之后,参考x
中的bar.cc
确实会引用test_ns::x
(感谢using
指令)。
作为旁注,如果您不从extern int x;
删除bar.cc
(在包含头文件之后),它将声明一个新的全局变量::x
和不是指test_nest::x
。源文件中的using namespace
允许您在不引用类的命名空间的情况下定义类成员,但是命名空间范围实体(变量和函数)总是必须在命名空间内定义或使用限定名称。
答案 1 :(得分:0)
它们位于不同的编译单元中。您需要在公共标头中声明命名空间;您可以使用:
namespace test_ns {}
答案 2 :(得分:0)
命名空间在不同的文件中定义。它需要在头文件中定义,该文件应包含在bar.cc中。