命名空间std的定义

using namespace std是c++初学者经常遇到的语句(一般不建议粗暴地光棍std哈),非科班但是c++作为工科大一必修(坑爹,c++真正的精髓根本讲不了),当年老师被问到这条语句到底是啥时,也是语焉不详。我们知道c++标准库的所有标识符都定义在namespace std中,翻阅标准库的头文件都找不到熟知的命名空间定义。

命名空间的定义格式为

1  namespace namespace_name { 
2// 代码声明 
3 } 

 

命名空间的定义可以是分布式定义,即在不同文件中定义某个namespace_a,这些内容都属于其作用域。所以标准库的std应该不是集中定义在某个文件当中,而是分布在各个标准头文件当中。但是好像哪里都找不到标准的命名空间定义语句,原因在于c++帮我们把这些命令转换了形式,在yval_core.h中有预定义

#define _STD_BEGIN namespace std {
#define _STD_END   }
#define _STD       ::std::
#define _CHRONO    ::std::chrono::
#define _RANGES    ::std::ranges::

所以,在头文件看到如下的代码,就是对命名空间std的补充定义

_STD_BEGIN
template <class _Ty1, class _Ty2>
using _Common_float_type_t = conditional_t<is_same_v<_Ty1, long double> || is_same_v<_Ty2, long double>, long double,
    conditional_t<is_same_v<_Ty1, float> && is_same_v<_Ty2, float>, float,
        double>>; // find type for two-argument math function
_STD_END

 

posted @ 2022-04-05 12:01  xuxlone  阅读(515)  评论(0)    收藏  举报