作用域问题

koko1998 2008-03-07 10:30:49
为了更清楚说明问题,先举个简单的例子:

#include <iostream>
#include <string>
using namespace std;

string init();//init関数宣言
int main()
{
int init = 0 ;//一時変数定義 →注意:関数名と同じ
string s = init();//init関数呼出 ⇒Compile異常発生
cout << init << endl << s << endl;
return 0;
}

string init()//init関数定義
{
return string("Hi.");
}


上面的例子中,编译不能通过,原因就是main函数的local scope的变量init的声明隐藏了grobal scope的init函数的声明。

c++中,总是感觉这样的做法有点不太友好。局部变量隐藏掉全局变量,内部函数声明隐藏掉外部的函数声明,这都是正常的。但为什么要用局部变量的声明来隐藏掉全局或是外部的函数的声明呢?
谁能告诉我c++这样做的原因,谢谢了。
...全文
315 28 打赏 收藏 转发到动态 举报
写回复
用AI写文章
28 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhouzhixun 2008-03-09
  • 打赏
  • 举报
回复
HAO A
koko1998 2008-03-08
  • 打赏
  • 举报
回复
好了,谢谢各位。揭帖子了。
koko1998 2008-03-08
  • 打赏
  • 举报
回复
确认过了,就是这个原因。可参照下面的例子。

#include <iostream>
#include <string>
using namespace std;

string init1();//init関数宣言
string (* const init)() = init1;
int main()
{
int init = 0 ;//一時変数定義 →注意:関数名と同じ
string s = init();//init関数呼出 ⇒Compile異常発生
cout << init << endl << s << endl;
return 0;
}

string init1()//init関数定義
{
return string("Hi.");
}
koko1998 2008-03-08
  • 打赏
  • 举报
回复
哈哈,怎么还有这样的规定,加分只能加100分,有些过了。对不起各位了,:)、
qiuqiu173 2008-03-07
  • 打赏
  • 举报
回复
你也提到了作用域问题
全局变量和局部变量编译后不是在同一地方
既然这样,他们不会冲突,那你还去弄个判断他们是否相同,这不是多余吗?效率也低了
sooho 2008-03-07
  • 打赏
  • 举报
回复
Cplusplus2005 正解。

问一下搂主:
不隐藏岂不是很混乱了吗?

guanghong 2008-03-07
  • 打赏
  • 举报
回复
关注!
Cplusplus2005 2008-03-07
  • 打赏
  • 举报
回复
个人见解:

如果隐藏也要区分类型的话,那编译器实现时,就必须为每个变量准备好一个附加空间,用以记录该变量的类型。
在变量定义时,不仅要对比变量名,还要对比类型。
无论在时间和空间上都比较低效。
taodm 2008-03-07
  • 打赏
  • 举报
回复
去看<C++ Gotchas>
sinosinux 2008-03-07
  • 打赏
  • 举报
回复
这个是语义要求吧
xhd3767 2008-03-07
  • 打赏
  • 举报
回复
关注中!!
joinnycoo 2008-03-07
  • 打赏
  • 举报
回复
为什么不能换个变量名呢?
Cplusplus2005 2008-03-07
  • 打赏
  • 举报
回复
应该是处于效率考虑吧, 编译器的设计者都是信奉效率至上的。
con_con 2008-03-07
  • 打赏
  • 举报
回复
搞不懂
为什么要一样
koko1998 2008-03-07
  • 打赏
  • 举报
回复
这么多人参与,关注,十分感谢,所以明天再加30分,精神支柱一下。
koko1998 2008-03-07
  • 打赏
  • 举报
回复
还有,函数名将被自动解释为指向函数的指针跟准确地讲应该是指向函数的const指针.
感觉越来越对了,呵呵
欢迎拍砖,交流。。。
koko1998 2008-03-07
  • 打赏
  • 举报
回复
to ketao_78
分析如下。在你的main函数中,根本就没有init 的函数调用,当然也就没有main函数中的那个init的声明隐藏掉了init函数指针变量
而你这样设计之后,在main函数中用的函数指针变量已经是b了,也就自然编译没有问题了
koko1998 2008-03-07
  • 打赏
  • 举报
回复
原型:string init();
如何可看成int (*)()?
==================
被感染的,写错了。是string (*)();
ketao_78 2008-03-07
  • 打赏
  • 举报
回复
See this,

#include <iostream>
#include <string>
using namespace std;


float init();

float (* b)()=&init;

int main()
{
int init = 0 ;

float s=b();
cout << init << endl << s << endl;
return 0;
}

float init()
{
return 0.1;
}
Cplusplus2005 2008-03-07
  • 打赏
  • 举报
回复
所以,init函数声明被解释成 int (*)() ,在C++编译器看来就是指向int (*)()的函数指针变量
================================================

原型:string init();
如何可看成int (*)()?
加载更多回复(8)

64,637

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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