精华内容
下载资源
问答
  • (1)又叫全局命名空间 (2)默认命名空间引用其他命名空间方法 (3)默认命名空间引用自己的方法 (4)其他命名空间引用默认命名空间中的方法::f(); 4.C++匿名命名空间 1.3.4.1、std和cout的引入 (1)std是C++标准库定义好的...

    1.默认命名空间

    1.1 默认命名空间的定义

    默认命名空间也叫全局命名空间,所有没有置于某一具体命名空间下的代码即在默认命名空间下,例如func(),main()函数。

    #include<iostream>
    
    void func(void);
    
    int main(int argc,char**argv)
    {
    	std::cout<<"this is main"<<std::endl;
    	return 0;
    }
    
    void func(void)
    {
    	std::cout<<"this is func"<<std::endl;
    }
    

    需要注意的是:

    • 1.默认命名空间也是命名空间。
    • 2.默认命名空间是全局的。
    • 3.main()函数必须置于默认命名空间下。

    1.2 默认命名空间引用其他命名空间

    默认命名空间引用其他命名空间的方法与上一篇中的使用命名空间的方法是一样的,这里不再多说了。

    1.3 默认命名空间引用自己

    这个就是类似于C语言里简单的没有命名空间的函数调用,如下面的代码中main()调用func1()

    #include<iostream>
    
    void func1(void);
    
    int main(int argc,char**argv)
    {
    	func1();
    	return 0;
    }
    
    void func1(void)
    {
    	std::cout<<"this is func1"<<std::endl;
    }
    

    1.4 其他命名空间引用默认命名空间

    其他命名空间引用默认命名空间同样使用::,但是前面命名空间的名字是空白的,例如下面的代码中命名空间ns引用默认命名空间下的func()

    #include<iostream>
    
    void func1(void);
    
    namespace ns
    {
    	void func2(void)
    	{
    		::func1();
    	}
    }
    
    int main(int argc,char**argv)
    {
    	ns::func2();
    	return 0;
    }
    
    void func1(void)
    {
    	std::cout<<"this is ::func1"<<std::endl;
    }
    

    2.匿名命名空间

    2.1 匿名命名空间的定义

    匿名命名空间和全局命名空间有些类似,他们都没有名字,但是全局命名空间不需要自己定义,而匿名命名空间需要自己去定义,方法就是namespace后面没有空间名,直接就是 {}

    namespace
    {
    	void func(void)
    	{
    		std::cout<<"来自匿名命名空间的func()."<<std::endl;
    	}
    }
    

    2.2 匿名命名空间中引用其他命名空间

    匿名命名空间引用其他命名空间的方法与上一篇中的使用命名空间的方法是一样的,这里不再多说了。

    2.3 匿名命名空间中引用自己

    直接用,无需添加命名空间名前缀,只要确保先声明后使用的顺序就没有问题。

    2.4 其他命名空间中引用匿名命名空间

    一般匿名命名空间定义于文件前面,类似于全局函数位置,之后的命名空间可以正常访问匿名命名空间中的内容,但是匿名命名空间的作用不在于此,而是在于跨文件访问的时候。因此其实对于单个文件内部,使用匿名命名空间与全局函数并无多大差别。

    2.5 匿名命名空间的意义

    • 1.匿名命名空间中的符号限于文件内部使用,不需要被外部引用。
    • 2.匿名命名空间效果类似于全局变量和函数加static,但是比C中的static使用范围广,static只能用于修饰函数名变量名,而不能用于修饰一个类型,如struct,class,而匿名命名空间则不局限于这些。
    • 3.匿名命名空间虽然是一种特殊情况,但是用法逻辑上符合整个命名空间的一般原则。
    展开全文
  • C++ 命名空间以及自定义命名空间

    千次阅读 2019-09-25 22:31:21
    1. C++中的命名空间 标准命名空间 namespace std C++在一般的库文件以及常规操作都需要包含C++标准的命名空间std,用户在使用等头文件时,C++标准把所有的有关stream中的关键字都加上了std的命名空间。所以用户在...

    C++命名空间

    1. C++中的命名空间

    标准命名空间 namespace std

    C++在一般的库文件以及常规操作都需要包含C++标准的命名空间std,用户在使用等头文件时,C++标准把所有的有关stream中的关键字都加上了std的命名空间。所以用户在使用该库文件中的关键字时,需要加上命名空间。
    使用格式:

    std::cout<< a << std::endl;
    //需要加上std空间名
    

    或者

    #include<iostream>
    using namespace std;//直接使用命名空间std
    cout<< a << endl;
    

    用户自定义命名空间

    用户在使用C++时,肯定在某些时候需要使用自己命名空间,所以,C++给出了用户使用自己命名空间的方法。
    namespace name{}

    namespace mynamespace{
    int num = 10;
    void func()
    {}
    ...
    }
    //访问方式
    mynamespace::num;
    mynamespace::func();
    

    访问的时候需要加上自己的命名空间名字,这样就可以正长进行访问了。

    命名空间也是一个独立的作用域

    用户或者C++本身定义了命名空间后,在该命名空间中也是一个独立的作用域,可以和其他作用域中存在相同名称的变量和函数。

    命名空间的重要性

    • 可以使不用用户在相同工程下的名称相同的变量分隔开来,这样可以使效率更高。
    • 使用命名空间可以更为清晰明了的表明用户定义的变量/函数在哪个地方,使得其他观看者更为清除的观赏代码。
    • 不同作用域下可以使定义的变量函数更为严谨。
    展开全文
  • 命名空间

    2015-05-04 11:30:07
    命名空间分割了全局命名空间,其中每个命名空间个作用域。命名空间定义 命名空间的定义包含两部分:首先是关键字namespace,随后是命名空间的名字。在命名空间名字后面是系列由花括号括起来的声明和定义...

    命名空间为防止名字冲突提供了更加可控的机制。命名空间分割了全局命名空间,其中每个命名空间是一个作用域。

    命名空间定义
    一个命名空间的定义包含两部分:首先是关键字namespace,随后是命名空间的名字。在命名空间名字后面是一系列由花括号括起来的声明和定义。只要能出现在全局作用域中的声明就能置于命名空间中。

    每个命名空间都是一个作用域
    命名空间中的每个名字都必须表示该空间内的唯一实体。

    定义在某个命名空间中的名字可以被该命名空间内的其他成员直接访问,也可以被这些成员内嵌作用域中的任何单位访问。

    命名空间可以是不连续的
    命名空间可以定义在几个不同的部分。

    定义多个类型不相关的命名空间应该使用单独的文件分别表示每个类型(或关联类型构成的集合)。

    通常情况下,我们不把#include放在命名空间内部。

    定义命名空间成员
    假定作用域中存在合适的声明语句,则命名空间中的代码可以使用同一命名空间定义的名字的简写形式。
    也可以在命名空间定义的外部定义该命名空间的成员。命名空间对于名字的声明必须在作用域内,同时该名字的定义需要明确指出其所属的命名空间。
    尽管命名空间的成员可以定义在命名空间外部,但是这样的定义必须出现在所属命名空间的外层空间中

    模板特例化
    模板特例化必须定义在原始模板所属的命名空间中。和其他命名空间名字类似,只要我们在命名空间中声明了特例化,就能在命名空间外部定义它了。

    全局命名空间
    全局作用域中定义的名字(即在所有类、函数及命名空间之外定义的名字)也就是定义在全局命名空间(global namespace)中。全局命名空间以隐式的方式声明,并且在所有程序中都存在。全局作用域中定义的名字被隐式地添加到全局命名空间中。

    内联命名空间
    C++11新标准引入了一种新的嵌套命名空间,称为内联命名空间(inline namespace)。和普通的嵌套命名空间不同,内联命名空间中的名字可以被外层命名空间直接使用。

    未命名的命名空间
    未命名的命名空间(unnamed namespace)是指关键字namespace后紧跟花括号起来的一系列声明语句。未命名的命名空间中定义的变量拥有静态生命周期:它们在第一次使用前创建,并且直到程序结束才销毁。
    一个未命名的命名空间可以在某个给定的文件内不连续,但是不能跨越多个文件。
    未命名的命名空间中定义的名字的作用域与该命名空间所在的作用域相同。如果未命名的命名空间定义在文件的最外层作用域中,则该命名空间中的名字一定要与全局作用域中的名字有所区别:

    int i;  // i的全局声明
    namespace 
    {
        int i;
    }
    // 二义性:i的定义既出现在全局作用域中,又出现在未嵌套的未命名的命名空间中
    i = 10;
    展开全文
  • TypeScript 命名空间

    2020-12-13 22:50:29
    命名空间一个最明确的目的就是解决重名问题。 假设这样一种情况,当一个班上有两个名叫小明的学生时,为了明确区分它们,我们在使用名字之外,不得不使用一些额外的信息,比如他们的姓(王小明,李小明),或者他们...
  • C++命名空间实例解析

    2020-12-31 13:57:40
    命名空间是C++非常重要的概念,...1、每个命名空间都是个作用域 和其他作用域类似,在命名空间中的每个名字必须表示唯一实体,而在不同命名空间中,可以有相同名字的成员。 2、命名空间可以是不连续的 命名空间可以定
  • 命名空间一个最明确的目的就是解决重名问题。这篇文章主要介绍了TypeScript 命名空间的相关知识,本文通过实例详解给大家介绍的非常详细,需要的朋友可以参考下
  • 命名空间 CONTENTS 定义命名空间 嵌套命名空间 using 关键字 1 2 3 目录 定义命名空间 1 namespace namespace_name { // 代码声明 } namespace_name.item_name; 定义命名空间 1 using System; namespace first_space...
  • 命名空间及匿名命名空间

    千次阅读 2013-10-10 10:44:11
    1. 使用命名空间的必要性  在个大的项目中,当多时合作时,多个人编写的库头文件中,不可以避免的存在变量名相同的冲突,特别都是作为全局变量存在的时候,这种冲突就更为明显,如何解决这种冲突?方法就是使用...

    把命名空间单独提出来描述是因为:命名空间的功能几乎和前缀是一致的。

    1.       使用命名空间的必要性

              在一个大的项目中,当多时合作时,多个人编写的库头文件中,不可以避免的存在变量名相同的冲突,特别都是作为全局变量存在的时候,这种冲突就更为明显,如何解决这种冲突?方法就是使用命名空间。

              比如说,每个人所定义的变量,都以他自己的名字的缩写为前缀,假如名字缩写为sxl,则定义一个全局变量CMD,则应该该为sxlCMD,但是这种组合方式从旁观者的角度看来是不顺眼的。为了解决这种问题,则使用命名空间。把sxl定义为命名,所以属于它的范围内的变量及函数都属于这个名字的空间。

    命名空间的定义方法:

    命名空间的使用方法为:

    在编写头文件时,一个良好的风格,就是尽量使用命名空间。

    有名字的命名空间是external linkage的,而匿名的命名空间是internal linkage的。

    2.       命名空间的使用规则

    1.  命名空间的使用(using namespace xxx)可以在函数内使用,而命名空间只限制在该函数内。

    2.  C++手册中规定,除了命名空间std外,其它的命名空间都可被修改(扩展)。如果修改命名空间std,则将导致不可预料的行为(undefined behavior)。但是在VS2008中验证,编译器并不阻止用户扩展std命名空间—可以通过编译。只能说明扩展命名空间导致的不可预料的后果由程序员承担。

    3.  不要在头文件中使用匿名命名空间,提倡在cpp/cc文件中使用匿名命名空间来代替static关键字。(!!尤其是绝对不要在头文件的匿名命名空间中定义类,原因见参见匿名命名空间的特殊点知识)

    4.  不能在命名空间中重载new/delete操作符,因为这很容易导致调用二义性。

    5.  对于长串的层级命名空间,如果每次都顺序列出命令空间,则使用不方便,可以使用命名空间的别名。如:

    namespace curSpace=std::tr1::regex_constants;

    using namespace curSpace;

    6.  使用命名空间别名时,只能一次性赋值,不能重赋值。这个类似于变量的引用:只能定义时给引用赋值,不能给引用改变引向。

    namespace curSpace=std::tr1::regex_constants;

    curSpace= std::tr1;                // error C2882:illegal use of namespaceidentifier in expression

    7.            命名空间的其它用法

    命名空间除常见的功能用于识别同名变量外/函数/类外,还有一个用法:版本控制:程序的有些功能,在不同的版本中,可能功能是不一样的,如果使用if/else来控制,有时可读性不太好,则这时可以使用命名空间。

     

    8.  命名空间的开销

    编译器通常函数的原型,函数的类名,函数的空间名来生成/定位一个独一无二的函数名字,这些查找都是静态的(在编译期执行)。因此,层次性的多级命名空间/命名空间切换只会带来编译时一些开销,而不会带来运行时的时间与内存开销。

    因此,使用命名开销是值得提倡的。(这种微小的编译开销是值得的)

    9.  由命名空间引起的include用法的变革。

    由于命名空间的原因,在新C++中,提倡引用头文件不再带.h。引用C头文件也不带.h,但是带前缀c。例如:

    #include <cstdio>                 //引用C头文件c为前缀

    #include<cassert>               //引用C头文件c为前缀

    #include <array>                               //引用C++头文件

    这是因为,C++会自动把许多声明归到std命名空间中去,而把C头文件中的声明加入到全局命名空间中去。(全局命名空间是不提倡的)

    C++仍然支持include的各种老的用法,但是不再提倡。

     

     

    3.       匿名命名空间的特殊点


    匿名命名空间(unnamed namespace, anonymousnamespace)

    匿名命名空间的一些特殊点会影响到它的使用,所以有必要单独列出来。

    通常除了类的静态成员函数和静态数据成员外,其它的static需求都提倡使用匿名命名空间来代替。

    Ø  代替static用法

    在标准C中,如果期望一个变量或者一种函数只能被本源文件(同个translation unit)使用,通常的做法是使用static来修饰这个变量/函数,来保证这个变量/函数具有内部链接(internal linkage)。这种技术称为信息隐藏。

    在C++中,仍然支持这种做法,但是已经不提倡,C++只提倡static仅仅用于修饰类成员,不再提倡用static来修饰非类成员。在以后的编译器中,可能会对使用static来修饰非类成员的方式给出编译警告。

     

    staticVarstaticFunc只能在本源文件中使用,不同的源文件中可以使用同名变量及函数,它们相互隐藏,不会产生命名冲突。

    注意:在VS2008上验证,只有顶级匿名命名空间才具有隐藏效果(不知道是C++语言是这么规定的,还是VS编译器的bug)。如果一个子匿名命令空间是定义在一个命名的命名空间中,则该匿名命令空间中定义的类和实例都可被其它源文件访问。

    Ø  不要在.h文件中使用匿名命名空间

    提倡在cpp/c源文件中使用unnamed namespace,不要(不提倡)在.h文件中什么匿名命令空间,因为其将生成大量不被使用类型或者数据---这些数据不是副本,是全局唯一的(原因见下面)。

    这里重提一下:.h文件与.cpp文件。.h文件不是编译单元,所以不能直接编译.h文件;.cpp/.cc文件才是编译单元,编译器可以直接编译.cpp/.cc文件。那么如果一个.cpp文件include了.h文件,是什么效果呢?直白的意思就是:把所有(直接/间接)include的.h的文件内容直接复制到该.cpp文件中,再对该.cpp文件编译。这就意味着,如果在一个头文件中定义了unnamed namespace,那么所有include该.h的编译单元(.cpp/.cc文件),都会完全包含该.h文件中的所有内容,那么,一个.cpp/.cc中包含的匿名空间里的数据,它自己当然能访问了。无论它具有的是内部链接属性,还是外部链接属性,都不影响访问。(除非对访问对象有链接属性要求的场景:比如模块的非类型参数-数据实参)。

    原因分析:虽然unnamed namespce是internal linkage,但是如果其在.h文件中使用,并且该.h文件被多个.cpp文件引用的时候,编译器会为这个匿名的命名空间在不同的.cpp中生成不同的唯一的空间名字(即开发者使用匿名命名空间,但是编译器编译时仍然给它生成了一个唯一的名字)。

    比如:对于匿名命名空间中的类型struct LocalType,其在编译单元src1.cpp的内部名字是::a0b2de::LocalType,在编译单元src2.cpp的内部名字是::d3fe23d:: LocalType。

    对于开发者来说,看到的只是LocalType,但是对于编译器来说,其看到的是两个不同的类型(因为其在不同的命名空间中)。所以意味着当该.h文件被include时,其在每个cpp文件中有一份命名空间不同的同名类型LocalType。如果在该匿名命令空间中定义了类型,那么意味着潜在地存在错误。考虑下面这种情况。

    在匿名命名空间中定义了一个新的用户类型,如果这个匿名命名空间在头文件中,那么其将被inlcude到各个源文件并且一变多成为多个不同的类型。

    在不同的(cpp/cc)源文件中,用户看到的同一个类名,但是在不同的translation unit中,编译器为它们添加了不同的C++修饰名(命名空间),即在不同的编译单元中,它们是不同的类型。如果这种情况下,需要使用type_info类的信息进行比较,就会得出错误的结果。代码:

    a) 在头文件中定义匿名命名空间

     

    b) 分别在两个cpp文件中使用Type2Type类型

    在第一个源文件中

     

     

    在第二个源文件中

     

    其实在这两个源文件中使用的LocalType类并不是同一个类—编译器在各自的编译单元里为它们添加了不同的C++修饰符。

    C ) 测试代码

     

     

    D) 测试结果

    在调试器中观察其值:

     

    可以看到除了这两个类的基本名字相同外,其原始名字(即修饰名)和type_info的比较结果都是不同的(type_info使用原始名字进行比较)。

    原始名字中的不同(黄色)部分,就是编译器为不同编译单元中的LocalType生成的匿名空间的空间名(参考"C++修饰名"知识点),由此证明在上面两个源文件中(init_1.cpp/init_2.cpp)使用的LocalType并不是同一个类。

    (其中编译器生成的匿名空间名字猜测是文件路径的某种编码信息,比如把第二个源文件的文件名由init_2.cpp改成init_2_ex.cpp,则其相应的黄色部分变成?A0xafb6ef69; 而改动init_2.cpp的文件内容,重新编译,则黄色部分的值并不改变。即匿名空间的修饰名包含源文件路径信息)

     

    Ø  在模板元设计中小心使用匿名命名空间

    匿名空间具有内部链接属性,其内部定义的函数/类型/变量/常量在不同的编译单元都是不同的,所以在进行模板设计时,尤其要小心,以防止传入的类型参数来自于不同编译单元的匿名命名空间,这样开发者字面意思看到的是同一类型,但是模板元逻辑处理中,竟然是不同的类型,很容易被认为是编译器的bug。

    出于这个目的,我们可以考虑在模板元设计中禁止使用匿名命名空间。

    这其实是上一条规则中的一个实例:因为模板元代码都是在.h文件中的,而"不要在.h文件中使用匿名命名空间"

     

    Ø  无法引用定义在匿名命名空间中其它编译单元里的类型和数据。

    正是因为上述的原因(编译器为不同编译单元里的匿名命名空间生成了不同的名字),所以我们无法引用定义在其它编译单元的匿名命名空间中定义的类型和数据,哪怕这些类型和数据来自于同一个.h文件――在这种情况下,我们引用的类型和名字,并不是我们逻辑上期望的那个类型和名字,这即意味着一个实现错误

     

     

     

    展开全文
  • C++命名空间

    千次阅读 多人点赞 2021-02-10 21:49:52
    以前上课在Android studio上用java写代码的时候,有个函数明明和书上一样,但就是出错,捣鼓了半天,原来是包导错了,为了耍帅,手快,package xxxxx 这个包就是java中的命名空间,刚学java的时候,老师总是会让...
  • 命名空间概念:命名空间种封装事物的方法,类似于目录和文件。 命名空间解决的问题(手册上也写的很清楚,下面按照自己的理解简化了): 1:解决程序编写者自己写的类、常量、函数和php内部的或者第三方的...
  • C++ 命名空间

    2021-01-03 01:46:52
    C++ 命名空间 假设这样种情况,当个班上有两个名叫 Zara 的学生时,为了明确区分它们,我们在使用名字之外,不得不使用一些额外的信息,...本质上,命名空间就是定义了个范围。 我们举个计算机系统中的例子,
  • 命名空间 Linux

    2014-11-21 22:21:57
    目前Linux实现了六种类型的namespace 每个namespace是包装了一些全局系统资源的抽象集合 这抽象集合使得在进程的命名空间中可以看到全局系统资源 命名空间个总体目标是支持轻量级虚拟化工具container的实现 ...
  • std命名空间

    千次阅读 2019-05-15 19:05:00
    1. 什么是命名空间 在编程语言中,命名空间种特殊的作用域,它包含了处于该作用域中的所有标示符,而且其本身也是由标示符表示的。命名空间的使用目的是为了将逻辑相关的标示符限定在一起,组成相应的命名空间...
  • HBase命名空间

    千次阅读 2018-05-07 19:11:40
    HBase命名空间 1.什么是命名空间? 我的理解就是:对hbase中表...创建命名空间:"haha" hbase(main):001:0&gt; create_namespace 'haha' 0 row(s) in 1.0220 seconds //2.查看命名空间:"h...
  • PHP 命名空间

    2019-01-16 10:49:09
    命名空间是什么? 命名空间是现代PHP特性之,从PHP5.3.0开始引入,其作用是将PHP代码按照种虚拟的层次结构进行组织,这种结构类似于操作系统中文件系统的目录结构。下面看个例子 第三行:name...
  • 命名空间的理解

    2017-11-16 00:43:05
    一、为什么要有命名空间一个工程的完成,往往由不同的人来共同完成,此时就有可能出现一个问题,不同的人写的函数名字会和另外一个人写的函数名字相同,此时哪一个函数是我们需要的呢? 所以我们为了解决这样的冲突...
  • javascript模拟命名空间

    2021-01-19 17:48:52
    在 C++ 和 C# 中,命名空间...如果要创建个 JavaScript 库,则可以将它们包装在命名空间内,而不需要定义全局函数和类,如下所示: var MSDNMagNS = {}; MSDNMagNS.Pet = function(name) { // code here }; MSDNMa
  • python命名空间

    千次阅读 2020-02-28 09:08:02
    就是python解释器启动就可以使用的名字存储在内置命名空间中 内置的名字在启动解释器的时候被加载进内存里 全局命名空间 —— 我们写的代码但不是函数中的代码 是在程序从上到下被执行的过程中依次加载进内存的 ...
  • Python命名空间详解

    2021-01-21 17:34:14
    通俗的来说,Python中所谓的命名空间可以理解为个容器。在这个容器中可以装许多标识符。不同容器中的同名的标识符是不会相互冲突的。理解python的命名空间需要掌握三条规则: 第,赋值(包括显式赋值和隐式赋值...
  • 在有了p命名空间和c命名空间时我们可以简单的把它们当做bean的个属性来进行定义。4.1 p命名空间使用p命名空间时需要先声明使用对应的命名空间,即在beans元素上加入xmlns:p="http://www.springframework.org
  • oracle命名空间

    2017-05-25 21:22:18
    oracle命名空间
  • 1. 声明了命名空间之后,下面的const, function, class都会划归到该命名空间。 2. 只有声明过命名空间的PHP 文件才能加载有命名空间的PHP文件。 3. PHP 5.3 及以上才能使用命名空间 名词: 关键字:namespace 用来...
  • 然而,在不同的文件中给命名空间添加属性的时候,首先要保证这个命名空间是已经存在的,同时不对已有的命名空间造成任何破坏。可以通过非破坏性的命名空间函数实现: 代码如下:var KUI = KUI || {};KUI.utils =...
  • php命名空间学习详解

    2020-12-18 15:57:30
    1、什么是命名空间命名空间种特殊的作用域,它包含处于该作用域下的标识符,同时它本身也是种标识符。可以把命名空间与操作系统的目录对应起来。命名空间相当于个目录,命名空间里的类,函数,常量,...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 763,979
精华内容 305,591
关键字:

命名空间的一