C++匿名命名空间

1. std和cout的引入

(1)std是C++标准库定义好的一个namespace

         C++为了保证程序员定义的函数不与标准库中的函数不冲突,用了命名空间这种机制;C语言是不能保证C的标准库中的函数名与程序员自己定义的函数名不冲突,C语言中完全是靠程序员自己注意来避免与C标准库中的函数不冲突。

(2)cout是std这个namespace下的一个标准输出工具(实际是一个对象),类似于C中的printf。

例子

#include <iostream>  //包含头文件iostream是因为命名空间std在里面声明了

using namespace std;

int main(void)
{
    cout << "hello world." << endl;  //cout和endl都定义在std中
    
    return 0;
}

或者这可以这么写

#include <iostream>  //包含头文件iostream是因为命名空间std在里面声明了

//using namespace std;

int main(void)
{
    std::cout << "hello world." << std::endl;  //cout和endl都定义在std中,这个endl就是换行
    
    return 0;
}

2. 匿名命名空间的定义和使用

(1)定义

(2)匿名命名空间中引用自己命名空间中的方法

(3)匿名命名空间中引用自己命名空间中的方法

(4)其他命名空间中引用匿名命名空间中的方法

#include <iostream>  //包含头文件iostream是因为命名空间std在里面声明了

using namespace std;

namespace               //匿名命名空间,没有名字
{
    void func2(void)
    {
        cout << "func2 from anonymous namespace" << endl;
    }
}

namespace NS            //有名命名空间,名字就是NS
{
    void func1(void)
    {
//        cout << "func1 from namespace NS" << endl;
        func2();
    }
};

int main(void)
{
    NS::func1();
//    std::cout << "hello world." << std::endl;  //cout和endl都定义在std中
    
    return 0;
}

总结:匿名命名空间是跨文件使用的时候才能起作用

创建两个文件hello.cpp 及hello2.cpp

hello.cpp内容如下:

#include <iostream>  //包含头文件iostream是因为命名空间std在里面声明了

using namespace std;

namespace            //声明匿名命名空间
{
    extern void func2(void); //加extern是在另外一个文件中定义
}

namespace NS            //有名命名空间,名字就是NS
{
    void func1(void)
    {
//        cout << "func1 from namespace NS" << endl;
        func2();
    }
};

int main(void)
{
    NS::func1();
//    std::cout << "hello world." << std::endl;  //cout和endl都定义在std中
    
    return 0;
}

hello2.cpp内容如下:

#include <iostream>  //下面使用cout和endl,所以要加他们的声明

using namespace std;  //std是C++标准库定义好的一个namespace,一次性声明指定命名空间std里面的所有变量函数等

namespace               //匿名命名空间,没有名字
{
    void func2(void)
    {
        cout << "func2 from anonymous namespace" << endl;
    }
}

编译如下:g++ hello.cpp hello2.cpp

报链接错误

hello.cpp:7:14: warning: ‘void {anonymous}::func2()’ used but never defined
  extern void func2(void); //¼ÓexternÊÇÔÚÁíÍâÒ»¸öÎļþÖж¨Òå
              ^
/tmp/ccpdz1oY.o: In function `NS::func1()':
hello.cpp:(.text+0x7): undefined reference to `(anonymous namespace)::func2()'
collect2: error: ld returned 1 exit status

如果是非命名空间,编译链接完全没有问题

hello.cpp内容如下:

#include <iostream>  //包含头文件iostream是因为命名空间std在里面声明了

using namespace std;

namespace NS4           //声明命名空间NS4
{
    extern void func2(void); //加extern是在另外一个文件中定义
}

namespace NS            //有名命名空间,名字就是NS
{
    void func1(void)
    {
//        cout << "func1 from namespace NS" << endl;
        NS4::func2();
    }
};

int main(void)
{
    NS::func1();
//    std::cout << "hello world." << std::endl;  //cout和endl都定义在std中
    
    return 0;
}

hello2.cpp内容如下:

#include <iostream>  //下面使用cout和endl,所以要加他们的声明

using namespace std;  //std是C++标准库定义好的一个namespace,一次性声明指定命名空间std里面的所有变量函数等

namespace NS4             //命名空间NS4的定义
{
    void func2(void)
    {
        cout << "func2 from anonymous namespace" << endl;
    }
}

3. 匿名命名空间的价值

(1)匿名命名空间中的符号纯文件内部使用,不需要被外部引用

在C语言中做法是在函数等前面加上static

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值