請問(size_t)&(((s *)0)->m)怎麼解釋?

各位大大,小弟遇到兩個奇怪的問題,請問下面的C語法該怎麼解釋?有何意義啊?

第一個問題: (size_t)&(((s *)0)->m)甚麼意思?

#define soff(s,m) (size_t)&(((s *)0)->m)

const static TagItem tagItem[]= {

{MP_ARTIST, soff(ID3TagContent, artist), mp_parse_artist}

};

/* ID3 tag content */

typedef struct _ID3TagContent_

{

ID3String*artist;

} ID3TagContent;

typedef struct _TagItem_

{

intfield;

intoffset;

ParseFxparseFx;

} TagItem;

第二個問題:請問typedef id3_text_content *(*ParseFx)__P((const id3_content* content));該怎麼解釋?我看ParseFx好像是作者自己任意取的型別名......看的頭都暈了.....

typedef id3_text_content *(*ParseFx)__P((const id3_content* content));

typedef struct _TagItem_

{

int field;

int offset;

ParseFx parseFx;

} TagItem;

const static TagItem tagItem[]= {

{MP_ARTIST, soff(ID3TagContent, artist), mp_parse_artist}

};

感謝感謝~~~

2 Answers

Rating
  • Lv 7
    1 decade ago
    Favorite Answer

    #define soff(s,m) (size_t)&(((s *)0)->m)

    這個define是用來找出在s這個struct/class裡m這個成員變數在這struct/class裡的位置是多少,也就是它在這struct/class裡的offset是啥.

    比如說,我有一個struct叫hello.

    struct hello

    {

    short c;

    int i;

    };

    c在hello的位置是0.因c是hello裡的第一個成員變數.也就是說如果你有個hello的變數叫h.那h在記憶體裡的位置會跟h.c在記憶體裡的位置一樣.也就是說soff(struct hello, c)會等於0.

    i在hello的位置是4.因i前有c(和加上padding).也就是說如果你有個hello的變數叫h.那h.c在記憶體裡的位置會是h在記憶體裡的位置+4. 也就是說soff(struct hello, i)會等於4.

    知道這define的作用了.那這define是如何找出m在s裡的位置的?以下解釋是以上面的struct hello為主.

    要找出一個在struct hello裡的成員變數的位置有很多種找法.最容易懂的就是先宣告一個struct hello的變數叫h.然侯把在h裡的個成員變數的記憶體位置減去h的記憶體位置.就好了.例:

    struct hello h;

    printf(“%d”, &h.i - &h); //會顯示i在struct hello裡的位置. 答案是4

    printf(“%d”, &h.c - &h); //會顯示i在struct hello裡的位置. 答案是0

    雖然這種方法很容易懂.但是在速度方面比較慢且會佔據資源.因你要先宣告一個變數之後再做算數.

    還有一個方法就是,如果h在記憶體裡的位置是0的話那&h.i - &h不就變成&h.i – 0 = &h.i了嗎?這不就省去算數?

    那要如何把h的記憶體位置設為0?好像不行耶.不過沒關係.若不能把h的記憶體位置設為0,那我們可以假設在0的記憶體位置上有個struct hello啊.這就是(struct hello *)0的用意了.(struct hello *) 0會假設在0的記憶體位置上有個struct hello. ((struct hello *) 0)->i就是以0為主的i.所以&(((struct hello *) 0)->i)就是i在struct hello裡的位置了.這是不是跟soff(struct hello, i)一樣啊?

    #define soff(s,m) (size_t)&(((s *)0)->m)

    所以

    soff(struct hello, i) = (size_t) &(((struct hello *)0)->i)

    啊這樣不就省去宣告變數了?

    懂不懂?不懂請再問

    typedef id3_text_content *(*ParseFx)__P((const id3_content* content));

    是在自定一個型態叫ParseFx.這個型態是個函式指標.這函式指標是指向一個回傳型態為id3_text_content *且其唯一參數是個const id3_content*的函式.如果你宣告一個ParseFx的變數叫func的話那你可以用func指向任何一個回傳型態為id3_text_content *且其唯一參數是個const id3_content*的函式.

    比如說

    #include <stdio.h>

    /* hello是個回傳一個int *且其唯一參數是個int的函式 */

    int *hello(int i) { return(0); }

    /*自定一個型態叫func.這個型態是個函式指標.這函式指標是指向一個回傳型態為int *且其唯一參數是個int的函式.*/

    typedef int *(*func)(int);

    int main()

    {

    func f; //f可指向回傳一個int *且其唯一參數是個int的函式

    f = hello; //f指向hello()

    (*f)(1); //呼叫f指向的函式

    return(0);

    }

    懂不懂?不懂請再問.

    Source(s): Myself
  • 1 decade ago

    龍、請問一下#define soff(s,m) (size_t)&(((s *)0)->m)

    的作用已經知道了,但是我可以怎麼去看這個define,例如int *ptr代表宣告一個指向int的pointer,麻煩您了

Still have questions? Get your answers by asking now.