星海's Blog

老头初学编程
Qt = Cute Great LoveIt 之Json TreeWidget的生成 与QHttpMultiPart

Qt源代码初探(一)——qglobal.h

星海 posted @ 2013年5月12日 17:43 in 通用知识 , 5295 阅读
/*
  Qt中qRound的实现,在负数的情况下不同于一般的四舍五入。
  如果负数尾数 <=.5的情况下,则舍弃尾数。(注意,=的情况下也舍弃o)
  如果负数尾数 > 0.5的情况下,则负小数整数部分-1
**/
Q_DECL_CONSTEXPR inline int qRound(double d)
{ return d >= 0.0 ? int(d + 0.5) : int(d - double(int(d-1)) + 0.5) + int(d-1); }

/**
 * Qt中通过模板获取qptrdiff的类型
 * TODO: 知识点:我能力有限,暂时不清楚模板应用底层原理。
 * 通过模板参数直接获取相关类型
 * 似乎与工厂设计模式有些相近(只是个人理解,如有误请留言指正)
 */

template <int> struct QIntegerForSize;
template <>    struct QIntegerForSize<1> { typedef quint8  Unsigned; typedef qint8  Signed; };
template <>    struct QIntegerForSize<2> { typedef quint16 Unsigned; typedef qint16 Signed; };
template <>    struct QIntegerForSize<4> { typedef quint32 Unsigned; typedef qint32 Signed; };
template <>    struct QIntegerForSize<8> { typedef quint64 Unsigned; typedef qint64 Signed; };
template <class T> struct QIntegerForSizeof: QIntegerForSize<sizeof(T)> { };
typedef QIntegerForSizeof<void*>::Unsigned quintptr;
typedef QIntegerForSizeof<void*>::Signed qptrdiff;
typedef qptrdiff qintptr;

/* unused参数的非warnning */
#  define Q_UNUSED(x) (void)x;

/*
 * QGlobalStatic在非线程情况下为一般static实现
 * 在线程情况下使用了QAtomicPointer自动指针,然后用QGlobalStaticDeleter注册其智能指针,在QGlobalStaticDeleter析构后,自动delete掉QGlobalStatic对象。
 * TODO: 具体原因暂时不清
 */

/*
 * 因浮点数不适宜用 == 好直接比较,所以采用了浮点数精度模糊的方法
 */
Q_DECL_CONSTEXPR static inline bool qFuzzyCompare(double p1, double p2)
{  return (qAbs(p1 - p2) <= 0.000000000001 * qMin(qAbs(p1), qAbs(p2)));}

/**
 * Q_FOREACH宏末尾
 * 主要是兼顾Q_FOREACH之后的内容(用{}括起来)
 */
for (variable = *_container_.i;; __extension__ ({--_container_.brk; break;}))
{ ;}


/* 使用模板返回相关的指针,用于private class当中,避免void然后强制类型转换
 */
  template <typename T> static inline T *qGetPtrHelper(T *ptr) { return ptr; }
template <typename Wrapper> static inline typename Wrapper::pointer qGetPtrHelper(const Wrapper &p) { return p.data(); }

/*
 * Q_DECLARE_PRIVATE(Class)等宏通过类中的d_ptr和q_ptr实现private class,以实现二进制兼容
 */

/*
 * TODO: QPrivate 中的enable_if还需要了解,可借助 std::enable_if的说明
 */

登录 *


loading captcha image...
(输入验证码)
or Ctrl+Enter