经实验验证,修正对using namespace std的认识

备注①:name:符号。指的实体包括:变量、函数、类

备注②:认为全局命名空间也是一个包,在此称作 ROOT:: 或 global:: 

              (这样就有了两个特别的包:一个是全局包,一个是std包。但对于编译器(pack-path. names模型)来说,它们和用户自定义的namespace没有区别)


 

修正1. global::(全局包)中的names,并不都是用户自定义的。

           

2.   两条重要认识,以及由此解释一些之前的问题

一、using namespace xxx; <—> using pack-A的本质作用:   相当于把 导入的Pack-A的 names 移到 using pack-A;  这行文字所在的那个namespace   的names空间里。

二、所有非ROOT 的namespace里 ,都已默认存在 using namespace ::  (移入了ROOT包的 names ) ——>  所以才直接用全局的names

 

     结论1:之前都是 "using namespace std "写在自定义namespace外,那么这行处在global::中,导致:把引进来的std::包里的names移到了 global包,成为全局的名字。

                 又因为各namespace已默认导入了global::names,所以这部分std::names进入了各namespace里。

     导致的问题: 这样,当在wjh::内写某个name的定义时,若未加namespace-xxx::前缀而直接引用了 ‘fuck’,那么这个fuck可能有3处来源:

                                                                    ①wjh::fuck 

                                                                    ②(global::) fuck 

                                                                    ③namespace-ABC::fuck    //     在全局(=namespace外部) 中using namespace ABC后, ABC::下的names进入全局空间,进一步进入wjh::

                 只要以上3个namespace里存在不止一个 fuck 这个name,就属于 ‘Ambiguous function call’ 报错。 (也可能不报错,但编译器会自己挑一个合适的用!)

                 不存在什么优先认定,3个中只能存在1个!

     /*

                   *    ↑   修正:实验了一下,当不加包路径的 fuck存在上面①②③时,确实会选择①、编译器不提示报错。 所以同namespace的那个name确实是优先的

                   *         但当同namespace下无此name,②③是会冲突的。        

                   */

 

      结论2:所以using namespace std; 为什么不能使用?

        别人的模块引用了你的这个头文件后,多了这行字,原来未加namespace:: 引用的name只有一处定义,现在可能就多了个定义,

                  而编译器又不报错,就导致‘God knows what’种种奇特行为(因为引用的name被偷偷替换掉了)

 


写段实验代码验证一下以上认识:

   前提:<test.h> :  定义一个global::fuckit();    在namespace wjh{ }里也定义一个fuckit(); 

      观察:此时在wjh{ } 中引用 fuckit()  (不加wjh::),看是否提示

 
  

#ifndef _TRIAL_1_H
#define _TRIAL_1_H

int fuckit();

namespace wjh {
   int fuckit();
}
#endif

 
 

在global::下使用如下 (该main位于global空间)  

(using namespace wjh;  把 wjh::fuckit 这个name移入了global::中)

#include "trial-1.h"

using namespace wjh;

int main() {
    ::fuckit();
    wjh::fuckit();
    fuckit();   //报错!

    system("pause");
    return 1;
}

截图如下: 


 

更进一步的实验:

 1 #ifndef _TRIAL_1_H
 2 #define _TRIAL_1_H
 3 
 4 // ③ s_t_d::fuckit
 5 namespace s_t_d {
 6     int fuckit();
 7 }
 8 
 9 // ② (global::) fuckit
10 int fuckit();
11 
12 // ① wjh::fuckit
13 namespace wjh {
14     using namespace s_t_d;
15     int fuckit();
16     void call_fuckit();
17 }
18 
19 #endif

 

 1 #include "trial-1.h"
 2 
 3 #include <iostream>
 4 #include <cstdlib>
 5 
 6 //using namespace s_t_d;
 7 //using namespace wjh;
 8 
 9 int s_t_d::fuckit() {
10     std::cout << "s_t_d:: fuckit" << std::endl;
11     return 1;
12 }
13 int fuckit() {
14     std::cout << "global:: fuckit" << std::endl;
15     return 1;
16 }
17 int wjh::fuckit() {
18     std::cout << "wjh:: fuckit" << std::endl;
19     return 1;
20 }
21 
22 void wjh::call_fuckit() {
23     using namespace s_t_d;
24     std::cout << "running in wjh:: calling fuckit ..." << std::endl;
25     fuckit();
26 }
27 
28 int main() {
29     wjh::call_fuckit();
30 
31     fuckit();
32 
33     system("pause");
34     return 1;
35 }

 

转载于:https://www.cnblogs.com/nanlan2017/p/9182573.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
牙科就诊管理系统利用当下成熟完善的SSM框架,使用跨平台的可开发大型商业网站的Java语言,以及最受欢迎的RDBMS应用软件之一的Mysql数据库进行程序开发。实现了用户在线查看数据。管理员管理病例管理、字典管理、公告管理、药单管理、药品管理、药品收藏管理、药品评价管理、药品订单管理、牙医管理、牙医收藏管理、牙医评价管理、牙医挂号管理、用户管理、管理员管理等功能。牙科就诊管理系统的开发根据操作人员需要设计的界面简洁美观,在功能模块布局上跟同类型网站保持一致,程序在实现基本要求功能时,也为数据信息面临的安全问题提供了一些实用的解决方案。可以说该程序在帮助管理者高效率地处理工作事务的同时,也实现了数据信息的整体化,规范化与自动化。 管理员在后台主要管理病例管理、字典管理、公告管理、药单管理、药品管理、药品收藏管理、药品评价管理、药品订单管理、牙医管理、牙医收藏管理、牙医评价管理、牙医挂号管理、用户管理、管理员管理等。 牙医列表页面,此页面提供给管理员的功能有:查看牙医、新增牙医、修改牙医、删除牙医等。公告信息管理页面提供的功能操作有:新增公告,修改公告,删除公告操作。公告类型管理页面显示所有公告类型,在此页面既可以让管理员添加新的公告信息类型,也能对已有的公告类型信息执行编辑更新,失效的公告类型信息也能让管理员快速删除。药品管理页面,此页面提供给管理员的功能有:新增药品,修改药品,删除药品。药品类型管理页面,此页面提供给管理员的功能有:新增药品类型,修改药品类型,删除药品类型。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值