typedef分析(針對ccColor4B)

firedragonpzy發表於2012-08-09
[i][b]本文為firedragonpzy原創,轉載務必在明顯處註明:
轉載自【Softeware MyZone】原文連結: http://www.firedragonpzy.com.cn/index.php/archives/962[/b][/i]

    typedef 宣告,為現有型別建立一個別名。使用typedef可以簡化程式碼:例如:指標函式typedef int (*pzy) (int a); pzy wuzhe;另外,使用typedef可以促進跨平臺開發;研究這個主要是我使用cocos2d-x的時使用ccc4發現的;
大家看下原始碼:
typedef struct _ccColor4B
{
GLubyte r;
GLubyte g;
GLubyte b;
GLubyte a;
} ccColor4B;
//! helper macro that creates an ccColor4B type
static inline ccColor4B
ccc4(const GLubyte r, const GLubyte g, const GLubyte b, const GLubyte o)
{
ccColor4B c = {r, g, b, o};
return c;
}

/** RGBA color composed of 4 floats
@since v0.8
*/
typedef struct _ccColor4F {
GLfloat r;
GLfloat g;
GLfloat b;
GLfloat a;
} ccColor4F;

/** Returns a ccColor4F from a ccColor3B. Alpha will be 1.
@since v0.99.1
*/
static inline ccColor4F ccc4FFromccc3B(ccColor3B c)
{
ccColor4F c4 = {c.r/255.f, c.g/255.f, c.b/255.f, 1.f};
return c4;
}

_ccColor4B使用了GLubyte ,而_ccColor4F 使用了GLfloat ,GLfloat是這麼定義的;typedef khronos_float_t GLfloat;khronos_float_t 是這麼定義的typedef float khronos_float_t;我那個鬱悶啊!在之前直接使用float定義不就行了啊,為什麼使用khronos_float_t,多走一步,鬱悶……

而且GLubyte 也是同理,typedef khronos_uint8_t GLubyte;到typedef unsigned char khronos_uint8_t;
後來看了百科的:促進跨平臺開發

  typedef 有另外一個重要的用途,那就是定義機器無關的型別,例如,你可以定義一個叫 REAL 的浮點型別,在目標機器上它可以獲得最高的精度:
  typedef long double REAL;
  在不支援 long double 的機器上,該 typedef 看起來會是下面這樣:
  typedef double REAL;
  並且,在連 double 都不支援的機器上,該 typedef 看起來會是這樣:、
  typedef float REAL;
  你不用對原始碼做任何修改,便可以在每一種平臺上編譯這個使用 REAL 型別的應用程式。唯一要改的是 typedef 本身。在大多數情況下,甚至這個微小的變動完全都可以通過奇妙的條件編譯來自動實現。不是嗎? 標準庫廣泛地使用 typedef 來建立這樣的平臺無關型別:size_t,ptrdiff 和 fpos_t 就是其中的例子。此外,象 std::string 和 std::ofstream 這樣的 typedef 還隱藏了長長的,難以理解的模板特化語法,例如:basic_string,allocator> 和 basic_ofstream>。

才明白,原來是為了跨平臺……
但這裡也有個很值得研究的地方typedef unsigned char,在使用ccc4的時候我傳的是0~255,而typedef unsigned char這個是形式引數的型別,現在貼出,望大家詳解char,int等型別的定義……由於各種原因,請先到
[url]http://firedragonpzy.d3.tuidc.com/index.php/archives/962[/url]這裡評論留言
不早了,就到這裡吧,呼呼……

相關文章