请问各位一个关于using 声明和指令的一些疑惑 ????

超gogo 2009-04-16 10:10:37
“一般来说,使用using声明会更安全。因为,using声明只导入指定的名称,如果该名称与局部名称发生冲突,编译器会报错。而using指令导入整个命名空间中的所有成员的名称,包括那些可能根本用不到的名称,如果其中有名称与局部名称发生冲突,则编译器并不会发出任何警告信息,而只是用局部名去自动覆盖命名空间中的同名成员。特别是命名空间的开放性,使得一个命名空间的成员,可能分散在多个地方,程序员难以准确知道,别人到底为该命名空间添加了哪些名称。”
对于上面的话不是很明白,请各位朋友帮忙解释一下,最好是带实例程序,谢谢!!!!!
#include<iostream>
using std::cout;
int main()
{
int cout; //用 cout做变量
cout=1;
cout<<cout;
}


include<iostream>
using namespace std;

int main()
{
Int cout ;
cout=1;
cout<<cout;
}
在上面的两个程序里,都输出:“warning C4552: “<<”: 运算符不起任何作用;应输入带副作用的运算符” 按照上面的话不是应该在程序2中不显示warning 吗???
...全文
191 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
超gogo 2009-04-25
  • 打赏
  • 举报
回复
谢谢 这个问题困扰我很久了
hityct1 2009-04-21
  • 打赏
  • 举报
回复
至于那个warning,
cout<<cout;中的“<<”是左移操作符,需要把结果赋给一个对象。


#include "stdafx.h"//非vc编译器可去掉
#include <iostream>
//using namespace std;


int main()
{
int cout ;
cout = 1;
cout = cout<<cout;
std::cout<<cout<< std::endl;//输出2
}

hityct1 2009-04-21
  • 打赏
  • 举报
回复
但是这样也不会出错:

#include "stdafx.h"//非vc编译器可去掉
#include <iostream>
using namespace std;

namespace myname
{
int n = 7;
}

int main()
{
using myname::n;

{
int n = 5;
}
cout<< n <<endl;//输出7
return 0;
}


看来:using myname::n;这句话指定的名称 只会与有相同作用域的同名变量冲突(感觉这句话说的不太精确)。就像楼主的第一个例子,using指定的作用域与主函数内的cout作用域不同,所以无错。至于那个waring,和楼主的问题无关。
hityct1 2009-04-21
  • 打赏
  • 举报
回复
使用vs2008.
示例1:

namespace myname
{
int n = 7;
}

int main()
{
using myname::n;
int n = 5;
return 0;
}

编译出现错误:error C2374: “myname::n”: 重定义;多次初始化
符合这句话:“using声明只导入指定的名称,如果该名称与局部名称发生冲突,编译器会报错。”


示例2:

namespace myname
{
int n = 7;
}

int main()
{
using namespace myname;
int n = 5;
return 0;
}

编译正确。
符合这句话:
“而using指令导入整个命名空间中的所有成员的名称,包括那些可能根本用不到的名称,如果其中有名称与局部名称发生冲突,则编译器并不会发出任何警告信息,而只是用局部名去自动覆盖命名空间中的同名成员。”
fffanpei 2009-04-21
  • 打赏
  • 举报
回复
楼上说的很好
力为 2009-04-20
  • 打赏
  • 举报
回复
有没有Warning是编译器实现的问题。所以要看你用的编译器。
超gogo 2009-04-20
  • 打赏
  • 举报
回复
“一般来说,使用using声明会更安全。因为,using声明只导入指定的名称,如果该名称与局部名称发生冲突,编译器会报错。而using指令导入整个命名空间中的所有成员的名称,包括那些可能根本用不到的名称,如果其中有名称与局部名称发生冲突,则编译器并不会发出任何警告信息,而只是用局部名去自动覆盖命名空间中的同名成员。特别是命名空间的开放性,使得一个命名空间的成员,可能分散在多个地方,程序员难以准确知道,别人到底为该命名空间添加了哪些名称。”
对于上面的话不是很明白,请各位朋友帮忙解释一下,最好是带实例程序,谢谢!!!!!

我的问题主要是解释上面的话的意思,谢谢!!!!!
超gogo 2009-04-19
  • 打赏
  • 举报
回复
各位朋友帮忙啊 谢谢 只要举出例子就行 谢谢
超gogo 2009-04-18
  • 打赏
  • 举报
回复
各位能具体的解释一下啊 举个例子 谢谢 针对那段话
超gogo 2009-04-18
  • 打赏
  • 举报
回复
大家帮忙啊 谢谢
fox000002 2009-04-17
  • 打赏
  • 举报
回复
在上面的两个程序里,都输出:“warning C4552: “ < <”: 运算符不起任何作用;应输入带副作用的运算符” 按照上面的话不是应该在程序2中不显示warning 吗???

lz 理解错误,两种方式都把 std::cout 引入了

区别只是 using namespace std 引入其他很多 std 中的标识

yqlhust 2009-04-17
  • 打赏
  • 举报
回复
同意楼上的
定义的局部变量和标准输出对象cout的标识符是一样的,编译器识别不了肯定会报错啊
楼主需要换一个变量标识符
wangyadong 2009-04-17
  • 打赏
  • 举报
回复

int main()
{
int cout1 ;
cout1=1;
cout <<cout1;
}
这样就不会有问题了
wangyadong 2009-04-17
  • 打赏
  • 举报
回复
你定义的变量和cout重合 所以会认为是局部变量
超gogo 2009-04-17
  • 打赏
  • 举报
回复
各位帮一下忙啊 谢谢!!!!
超gogo 2009-04-16
  • 打赏
  • 举报
回复
请各位朋友帮忙 , 谢谢

16,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧