在閱讀宋寶華的《Linux設備驅動開發詳解》一書時,看到下面這段代碼:
#define min(x, y) ({ \
const typeof(x) _x = (x); \
const typeof(y) -y = (y); \
(void) (&_x == &_y); \
_x < _y ? _x : _y; })
這段代碼可以理解如下:
(1)先賦值再比較,可以避免一般宏定義的副作用。
(2)用 const 可以提高可讀性。
(3)代碼 “(void) (&_x == &_y);” 的作用,是檢查 _x 與 _y 的類型是否一致。
(4)添加 void 可以避免編譯器彈出無意義的警告(因為其后面的地址比較的結果并沒有使用)。
怎樣理解第(3)點呢?
比如下面的這一段代碼:
int x = 2;
char y = 3;
int m = min(x, y);
在編譯的時候,編譯器會進行下面的判斷操作:
int * == char *;
因此編譯器會給出警告:
warning: comparison of distinct pointer types lacks a cast
因此 “(void) (&_x == &_y);” 可以檢查 _x 與 _y 的類型是否一致,如果不一致則編譯器給出警告。