Qt 源码学习日志 - corelib->kernel->qmath

来源:互联网 发布:基于关联规则推荐算法 编辑:程序博客网 时间:2024/05/22 09:45

现在开始研究 Qt for Android 源码。

利用blog,做好笔记。

 

今天研究 android-lighthouse/src/corelib/kernel/qmath.h 和 qmath.cpp

 

1、 QT_BEGIN_HEADER 和 QT_END_HEADER 宏: 根据不同平台,定义 extern "C" 或者 extern "C++" (符号签名方法)

2 、QT_MODULE 处理 Qt 的许可证信息

#define QT_MODULE(x) /
    typedef QtValidLicenseFor##x##Module Qt##x##Module;

 

3、Q_CORE_EXPORT 这个宏展开之后,在VC++(或者采用与VC++类似技术)的编译器中,是定义为 __declspec((dllexport)) 。而在UNIX系统的编译器中(gcc、cc),展开就是 __attribute__ ((visibility("default")).

      __attribute__ ((visibility(" <type> ")) 影响 ELF 文件中,符号的可见性(这是gcc的扩展编译器指令)

<type> 是下列值之一:

default   假定的符号可见性可通过其他选项进行更改。缺省可见性将覆盖此类更改。缺省可见性与外部链接对应。

hidden    该符号不存放在动态符号表中,因此,其他可执行文件或共享库都无法直接引用它。使用函数指针可进行间接引用。

internal  除非由 特定于处理器的应用二进制接口 (psABI)指定,否则,内部可见性意味着不允许从另一模块调用该函数。

protected   该符号存放在动态符号表中,但模块内的引用将与局部符号绑定。也就是说,另一模块无法覆盖该符号。

可在 C 和 C++ 中使用此属性。在 C++ 中,还可将它应用于类型、成员函数和命名空间声明。

示例

void __attribute__((visibility(“internal”))) foo()
{
....
}


4、inline 函数类型(以前以为inline是C++的用法)。 inline函数,必须把函数体和函数声明放在一起才有效,否则当作普通函数。
inline函数的执行,是直接使用函数代码(函数的代码直接存入符号表,因此该函数不能太大,而且经常被调用。inline函数的引入是
为了解决频繁调用的小函数调用占用太多栈空间的问题。)

5、定义函数 qCeil(调用的其实是glibc中的 ceil 或者 ceilf)取大于这个浮点数的最小整数
      定义函数 qFloor ( glibc:: floor() or floorf() )  取小于这个浮点数的最大整数
qFabs <-> fabs / fabsf 浮点数取绝对值
      qSin <-> sin / sinf

....

总结:
qmath.cpp 和 qmath.h 封装了一下 glibc的 math.h 中定义的函数。其实只有这么几个:
qCeil , 进位 & 取整
qFloor, 舍弃小数点 & 取整
qFabs, 取绝对值(浮点数)
qSin, qCos  正(余)弦函数
qTan 正切
qACos, qASin, qATan, 反正弦,反余弦,反正切
qATan2, 反正切(x/y)
qSqrt, qLn, qExp, qPow 开平方根,取对数(调用glibc中的log), 平方,幂运算

另外qMath自己实现了一个加快正弦、余弦计算速度的函数: qFastSin, qFastCos 。怎么计算就不研究了。

结束。



原创粉丝点击