有一個Macro如下, 試拆解並描述該巨集在做什麼事?

#define macro_x(data_a, data_b) ((size_t)((char *)&((data_a *)0)->data_b - (char *)0))

提示:

  1. data_a與data_b有關係
  2. 它是C語言generic marco

首先拆解右邊中括號的運算, 大概可以得知data_b是data_a的member variable

(data_a *)0)->data_b - (char *)0)

但(data_a *)0->data_b與(char *)0在這邊的運算是個陷阱, (data_a *)0針對0做轉型, 所以肯定是null pointer, 然後從轉型後的null pointer提取data_b跟(char *)0做差值運算, 那應該會有問題吧!!??

所以我們在往運算式的前面部份看一些些, 一直看到&的部份, 可以得知該運算就是取得data_a中data_b的member variable offset

&((data_a *)0)->data_b

假設data_a的結構如下

typedef struct _data_a //starting from (char *)0
{
int some_data;//4 bytes 
int data_b;//4 bytes
}

則&((data_a *)0)->data_b的輸出就是0x4, 而減掉(char *)0的部份可以用也可以不用, 差異不大

整段巨集其實擺了一些未知的輸入變數和假運算讓面試的人感到疑惑, 但抽掉一些沒用的運算, 其實就是取得結構中變數offset

這題我有試著讓我們部門大約10位有5到10年coding經驗的同仁做做看, 結果只有一位同仁能成功拆解該巨集並給出合理解釋, 所以面試如果碰到該題而且沒看過的話, 失敗率可能挺高的, 不過這也代表Amazon對於用人的要求有相當的水準

最後修改日期: 3 6 月, 2022

作者

留言

撰寫回覆或留言

發佈留言必須填寫的電子郵件地址不會公開。