ns.cpp
:
#include <iostream>
namespace ns { // want to access this globally
class A ;
}
class ns::A {
public:
int x1;
char s1[128];
};
int main()
{
int doit();
//using namespace ns;
ns::A a;
a.x1= 2;
std::cout << "pre " << a.x1 << "\n" ;
doit();
std::cout << "post " << a.x1 << "\n" ;
}
ns_call.cpp
:
namespace ns {
class A;
}
class ns::A {
public:
int x1;
char s1[];
};
using namespace ns;
int
doit()
{
extern ns::A a;
a.x1= 100;
}
在ns.cpp中,在名称空间中声明了一个类。 该课程的定义如下。
要在全局范围内访问类中的变量。这个 是命名空间的目标。
然后ns_call.cpp访问类'member,x1。
中的1个使用Fedora 14中的gcc 5.4.1编译了2个文件。 运行输出是:
pre 2
post 2
我预计'发布100'因为我想在A类中访问int x1 全局。
答案 0 :(得分:3)
extern
,namespace
或前瞻性声明似乎都不代表您认为的含义。
如果你想引入一个可以访问我的多个翻译单元的名称(当你说“全局”时你的意思),你可以将这些定义放在一个头文件中,#include
标题来自无论你想在哪里使用它。
您实际所做的是在每个翻译单元中反复引入class A
(例如,在每个CPP文件中)。这充其量违反了ODR。
答案 1 :(得分:1)
我只是帮你修复你的问题,而你绝对必须听取有关ODR(一个定义规则)的其他答案并修复你的设计。
在ns.cpp
文件中,您必须将行ns::A a;
移出main()
函数。将其放在文件范围内(例如,在main
之前。)此外,在ns_call.cpp
文件中,也将行extern ns::A a;
移出函数。
注意:您可能需要也可能不需要执行第二部分,这整个方法可能会也可能不会。我现在无法访问编译器。
我再次赞同其他评论,认为这种设计存在缺陷, 会让您感到头疼。