现在开始研究 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的扩展编译器指令)
<t
是下列值之一: ype>
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 。怎么计算就不研究了。
结束。