例如,
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);
}
}
Run Code Online (Sandbox Code Playgroud)
由于这些模板放在命名空间std和大写,大写,小写和大写都使用,为什么需要前导下划线(单和双)?它只是那些开发人员的味道吗?还是有一些合理的技术原因?
Jon*_*ely 13
考虑如果标准库实现看起来像这样会发生什么,使用没有下划线的理智名称:
template<typename RandomAccessIterator, typename Compare>
inline void
sort(RandomAccessIterator first, RandomAccessIterator last,
Compare comp);
Run Code Online (Sandbox Code Playgroud)
现在,如果它包含在用户的程序中,就像这样:
#define comp(X, Y) ((X) < (Y))
#include <algorithm>
Run Code Online (Sandbox Code Playgroud)
该comp宏定义会导致预处理程序打开sort声明这个:
template<typename RandomAccessIterator, typename Compare>
inline void
sort(RandomAccessIterator first, RandomAccessIterator last,
Compare ((X) < (Y)));
^^^^^^^^^^^
Run Code Online (Sandbox Code Playgroud)
这将无法编译.因为允许用户定义名称comp和Compare和RandomAccessIterator等的宏,并且因为宏不尊重名称空间或作用域或其他上下文,所以标准库必须使用带有前导下划线的丑陋名称来避免冲突.这是安全的,因为禁止用户声明任何名称之类的内容__comp,因此不会发生冲突.这些名称称为保留名称.
这不是编码标准,它是实现可以防止与任意用户定义名称冲突的唯一方法.要使约定工作,用户必须永远不要使用保留名称声明任何内容.您绝对不应该为自己的代码复制约定.
| 归档时间: |
|
| 查看次数: |
584 次 |
| 最近记录: |