当我编写以下代码时,它会被编译并正确执行:
#include <iostream>
using namespace std;
namespace first
{
int x = 5;
int y = 10;
}
namespace second
{
double x = 3.1416;
double y = 2.7183;
}
int main () {
using namespace first; //using derective
using second::y;
cout << x << endl;
cout << y << endl;
return 0;
}
但是如果我使用main函数之外的指令编写如下,
using namespace first; //using derective
using second::y;
int main () {
cout << x << endl;
cout << y << endl;
return 0;
}
它给出了这个编译错误:
g++ namespace03.cpp -o namespace03
namespace03.cpp: In function ‘int main()’:
namespace03.cpp:20:11: error: reference to ‘y’ is ambiguous
namespace03.cpp:13:10: error: candidates are: double second::y
namespace03.cpp:7:7: error: int first::y
make: *** [namespace03] Error 1
任何人都可以解释为什么using指令在内部使用时表现不同 main
和外面 main
?
使用声明就是声明。该 using second::y;
main内部类似于声明变量 y
在那个隐藏任何其他范围的范围内 y
在全局命名空间范围内。当你使用 using second::y;
在全局范围内,您没有隐藏任何名称,因为两者都有 y
s属于同一范围。
想象一下你的第一个例子如下(请参阅下面的评论以获得解释):
namespace first
{
int x = 5;
int y = 10;
}
int main () {
using namespace first; // This makes first::y visible hereafter
int y = 20; // This hides first::y (similar to using second::y)
cout << x << endl;
cout << y << endl; // Prints 20
}
但是,第二个例子是:
namespace first
{
int x = 5;
int y = 10;
}
using namespace first; // This makes first::y visible in global scope
int y = 20; // This is global ::y
int main () {
cout << x << endl;
cout << y << endl; // Error! Do you mean ::y or first::y?
}
使用声明就是声明。该 using second::y;
main内部类似于声明变量 y
在那个隐藏任何其他范围的范围内 y
在全局命名空间范围内。当你使用 using second::y;
在全局范围内,您没有隐藏任何名称,因为两者都有 y
s属于同一范围。
想象一下你的第一个例子如下(请参阅下面的评论以获得解释):
namespace first
{
int x = 5;
int y = 10;
}
int main () {
using namespace first; // This makes first::y visible hereafter
int y = 20; // This hides first::y (similar to using second::y)
cout << x << endl;
cout << y << endl; // Prints 20
}
但是,第二个例子是:
namespace first
{
int x = 5;
int y = 10;
}
using namespace first; // This makes first::y visible in global scope
int y = 20; // This is global ::y
int main () {
cout << x << endl;
cout << y << endl; // Error! Do you mean ::y or first::y?
}
using-declaration和using-directive有两个主要区别。
第一个区别: (明显的区别)。
namespace first{
int x=1;
int y=2;
}
using first::x; //using declaration
这将允许您使用该变量 x
无 命名空间名称 作为显式限定符,并注意这不包括 y
。
namespace first{
int x=1;
int y=2;
}
using namespace first;// using directive
这将允许您使用命名空间内的所有变量 first
无 命名空间名称 作为一个明确的限定词。
第二个差异: (这是你不明白的)。
我将向您解释为什么当您在main函数中使用using-directive和using-declaration时都没有错误,但是当您尝试在全局命名空间中使用它们时,您会收到编译时错误。
可以说我们在全局命名空间中定义了两个命名空间,如下所示:
namespace first
{
int x = 5;
int y = 10;
}
namespace second
{
double x = 3.1416;
double y = 2.7183;
}
例1:
int main () {
using namespace first;
using second::y;
cout << x << endl; // this will output first::x;
cout << y << endl; // this will output second::y;
return 0;
}
原因是使用指令 using second::y
将使你的变量 y
看起来它是一个局部变量的范围 using-directive
使用,在这种情况下,它在主函数内使用。而使用声明 using namespace first
将生成在此命名空间内定义的变量 first
看起来它们是全局变量,这仅在使用using-directive的范围内有效,在这种情况下它位于main函数内部。
所以,如果您应用上述内容,您将知道如果您执行了以下操作:
例2:
using namespace first;
using second::y;
int main () {
cout << x << endl;
cout << y << endl; // two definitions of y. first::y and second::y
return 0;
}
因为两者都会出错 first::y
和 second::y
将表现得好像它们是在全局命名空间中定义的,因此您最终会违反One Defintion规则。