Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1063109
  • 博文数量: 284
  • 博客积分: 8223
  • 博客等级: 中将
  • 技术积分: 3188
  • 用 户 组: 普通用户
  • 注册时间: 2008-12-01 13:26
文章分类

全部博文(284)

文章存档

2012年(18)

2011年(33)

2010年(83)

2009年(147)

2008年(3)

分类: C/C++

2009-08-05 12:52:51

  这份文档只列出个人感兴趣的,或者个人没有使用过的C++ 技术。
  代码来源:
  代码版本:v3.3
 
part 1:
 

__STL_BEGIN_NAMESPACE

STLBEGINNAMESPACE这个是一个定义的宏

如下:
#define STLBEGINNAMESPACE namespace std{

再如:
#define STLENDNAMESPACE }

这样,只要在这两个宏之间增加的代码,就等于被声明到了std的命名空间了。

STLBEGINNAMESPACE //namespace std{

class A
{
};

STLENDNAMESPACE  // }

part 2:

#if defined(__sgi) && !defined(__GNUC__) && (_MIPS_SIM != _MIPS_SIM_ABI32)
#pragma set woff 1209
#endif

#pragma set woff 1209   google一把的话就能找到它是MIPSpro C/C++编译器里supress warning的意思,大致相当于
VC++中的#pragma warning( disable : 1209 )。
关于#pragma你去看C++ ISO标准书的话能找到,它其实并没有多少限定。每个编译器实现都能自己修订。所以研究这个没多大意思,知道你常用的开发环境里可能对你来说有用的就够了。

part 3

 

template <class _ForwardIter>
bool is_sorted(_ForwardIter __first, _ForwardIter __last)
{
  __STL_REQUIRES(_ForwardIter, _ForwardIterator);
  __STL_REQUIRES(typename iterator_traits<_ForwardIter>::value_type,
                 _LessThanComparable);
  if (__first == __last)
    return true;

  _ForwardIter __next = __first;
  for (++__next; __next != __last; __first = __next, ++__next) {
    if (*__next < *__first)
      return false;
  }

  return true;
}

* 这里摘抄一段网上论坛上的讨论,
 
   __STL_REQUIRES(_ForwardIter, _ForwardIterator);
 
 
   #define __STL_REQUIRES(__type_var, __concept) \
   do { \
     void (*__x)( __type_var ) = __concept##_concept_specification< __type_var >\
       ::__concept##_requirement_violation; __x = __x; } while (0)
 
* 展开也就是这个样子.
 
  do { \
     void (*__x)(_ForwardIter ) = _ForwardIterator_concept_specification< _ForwardIter >\
       ::_ForwardIterator_concept_requirement_violation; __x = __x; } while (0)
 
  do {} while(0)是宏处理的技巧,且不管他,那也就是这个样子
 
  void (*__x)(_ForwardIter ) =
    _ForwardIterator_concept_specification< _ForwardIter >
       ::_ForwardIterator_concept_requirement_violation;
  __x = __x;

* 论坛最后,有人提到下面的句子,说这里是进行一种验证:
// Valid Expressions
   _STL_ERROR::__element_assignment_operator_requirement_violation(
                  __i,
                  __tmp_ptr,
                  _Dist());

【 在 nichloas (nil) 的大作中提到: 】
所以如果有语法错误, __x = __x;就会编译不过

* 检查_ForwardIterator_concept_specification的定义可以看出,代码是在检查向前迭代器的条件是否满足:
   template
   struct _ForwardIterator_concept_specification {
     static void
     _ForwardIterator_requirement_violation(_ForwardIterator __i) {
       // Refinement of InputIterator
       _InputIterator_concept_specification<_ForwardIterator>::
         _InputIterator_requirement_violation(__i);
     }
   };

  如果想深入研究下STL中的check机制,可以参考下面的这个链接:

http://hi.baidu.com/walkandsing/blog/item/a61af5f86ecef209d9f9fd83.html

阅读(1946) | 评论(0) | 转发(0) |
0

上一篇:C++学习过程

下一篇:学习C++中的一点疑惑

给主人留下些什么吧!~~