我有这个:
#include <iostream>
using namespace std;
// Variable created inside namespace
namespace first
{
int val = 500;
}
namespace
{
int val = 400;
}
// Global variable
//int val = 100;
int main()
{
// Local variable
int val = 200;
// These variables can be accessed from
// outside the namespace using the scope
// operator ::
cout << first::val << 'n';
cout << ::val << 'n';
cout << val << 'n';
return 0;
}
本例中的::val
将提供val = 400
。但是,如果我删除对全局变量的注释,那么::val
将到达全局命名空间。那么,在这种情况下,如何访问未命名的名称空间呢?
int val = 400;
这是带有
的输出// Global variable
int val = 100; //Not commented.
500
100
200
一个可能的解决方案是通过引用"hidden"来扩展未命名的名称空间。变量:
#include <iostream>
// Variable created inside namespace
namespace first
{
int val = 500;
}
namespace
{
int val = 400;
}
// Global variable
int val = 100;
namespace {
int& access_to_val=val;
}
int main()
{
using namespace std;
// Local variable
int val = 200;
// These variables can be accessed from
// outside the namespace using the scope
// operator ::
cout << first::val << 'n';
cout << ::val << 'n';
cout << val << 'n';
cout << access_to_val << 'n';
return 0;
}
与Godbolt核对代码。
程序的输出是:
500
100
200
400
作为旁注:避免在标题中使用using namespace std
。