首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么STL的命名惯例使用这么多的前导下划线?

为什么STL的命名惯例使用这么多的前导下划线?
EN

Stack Overflow用户
提问于 2014-03-11 08:19:17
回答 2查看 971关注 0票数 11

例如,

代码语言:javascript
复制
template<typename _RandomAccessIterator, typename _Compare>
inline void
sort(_RandomAccessIterator __first, _RandomAccessIterator __last,
     _Compare __comp)
{
    typedef typename iterator_traits<_RandomAccessIterator>::value_type
        _ValueType;

    // concept requirements
    __glibcxx_function_requires(_Mutable_RandomAccessIteratorConcept<
                                    _RandomAccessIterator>)
        __glibcxx_function_requires(_BinaryPredicateConcept<_Compare, _ValueType,
                                    _ValueType>)
        __glibcxx_requires_valid_range(__first, __last);

    if (__first != __last)
    {
        std::__introsort_loop(__first, __last,
                              std::__lg(__last - __first) * 2, __comp);
        std::__final_insertion_sort(__first, __last, __comp);
    }
}

既然这些模板被放置在名称空间std和大写中,小写和大写都会被使用,那么为什么需要前导下划线(单下划线和双下划线)?这只是那些开发人员的一种味道吗?还是有合理的技术原因?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-03-11 09:10:00

考虑一下,如果标准库实现看起来像这样,使用正常的名称而不使用下划线会发生什么情况:

代码语言:javascript
复制
template<typename RandomAccessIterator, typename Compare>
inline void
sort(RandomAccessIterator first, RandomAccessIterator last,
     Compare comp);

现在,如果它包含在用户的程序中,它是这样启动的:

代码语言:javascript
复制
#define comp(X, Y) ((X) < (Y))
#include <algorithm>

comp宏定义将导致预处理程序将sort声明转换为:

代码语言:javascript
复制
template<typename RandomAccessIterator, typename Compare>
inline void
sort(RandomAccessIterator first, RandomAccessIterator last,
     Compare ((X) < (Y)));
             ^^^^^^^^^^^

这将无法编译。由于允许用户使用compCompareRandomAccessIterator等名称定义宏,而且由于宏不尊重名称空间或作用域或其他上下文,标准库必须使用带有前导下划线的丑陋名称,以避免冲突。这是安全的,因为禁止用户使用__comp这样的名称声明任何内容,因此不会发生冲突。这样的名字叫做reserved names

--这不是一个编码标准,它是实现防止与任意用户定义的名称冲突的唯一方法。要使约定正常工作,用户绝不能声明任何具有保留名称的内容。您绝对不应该为您自己的代码复制约定。

票数 19
EN

Stack Overflow用户

发布于 2014-03-11 08:23:18

这些名称是保留的,不允许出现在用户代码中,参见例如What are the rules about using an underscore in a C++ identifier?。通过在标准文档或其实现中选择这些名称,可以避免名称冲突。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22319950

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档