(void) (&_x == &_y)的註釋

百度到的解釋 外加大神給的一些功能拓展

#include/linux/kernel.h
------------------------------------------------------
/*
 * min()/max() macros that also do
 * strict type-checking.. See the
 * "unnecessary" pointer comparison.
 */
#define min(x,y) ({         \
    typeof(x) _x = (x);     \
    typeof(y) _y = (y);     \
    (void) (&_x == &_y);    \
    _x < _y ? _x : _y; })

#define max(x,y) ({         \
    typeof(x) _x = (x);     \
    typeof(y) _y = (y);     \
    (void) (&_x == &_y);    \
    _x > _y ? _x : _y; })

 

 (void) (&_x == &_y)
這句不是爲了判斷兩個變量的地址是否相等,而是爲了判斷兩個變量的類型是否相同;如果類型不同,編譯階段,編譯器爲告警!

 

------------------------------------------------------

#include <stdio.h>

/* 使用該宏時,如果不關心返回值,沒有圓括號()也可以,但是{}是必須的 */
#define min(x, y) {                       \
    typeof(x) _min1 = (x);                \
    typeof(y) _min2 = (y);                \
    (void) (&_min1 == &_min2);            \
    _min1 < _min2 ? _min1 : _min2; }

int main ()
{
    min(10, 20); 
    if (1)
        min(10, 20); 
    return 0;
}

------------------------------------------------------
#include <stdio.h>

/* 
 * 用該宏時,如果關心返回值,就必須要圓括號()
 * 最後一句是該宏的返回值 
 */
#define min(x, y) ({                      \
    typeof(x) _min1 = (x);                \
    typeof(y) _min2 = (y);                \
    (void) (&_min1 == &_min2);            \
    _min1 < _min2 ? _min1 : _min2; })

int main ()
{
    int ret;
    ret = min(10, 20);
    printf("ret = %d\n", ret);
    return 0;
}


------------------------------------------------------
#include <stdio.h>

/* 
 * 檢測變量類型是否相同
 * (void) (&_min1 == &_min2);
 */
#define min(x, y) ({                      \
    typeof(x) _min1 = (x);                \
    typeof(y) _min2 = (y);                \
    (void) (&_min1 == &_min2);            \
    _min1 < _min2 ? _min1 : _min2; })

int main ()
{
    int  ret;
    int  i;
    char j;
    ret = min(i, j);
    printf("ret = %d\n", ret);
    return 0;

}


------------------------------------------------------
#include <stdio.h>

/* 
 * 防止類似i++類型的參數,被重複計算
 * typeof(x) _min1 = (x);
 */
#define min(x, y) ({                      \
    typeof(x) _min1 = (x);                \
    typeof(y) _min2 = (y);                \
    (void) (&_min1 == &_min2);            \
    _min1 < _min2 ? _min1 : _min2; })

int main ()
{
    int ret;
    int i = 100;
    int j = 200;
    ret = min(i++, j++);
    printf("ret = %d\n", ret);
    return 0;
}

------------------------------------------------------
#include <stdio.h>

/*
 * 這種寫法,利用了do while的巧妙之處,但是也有最大一個缺憾,無法獲得該宏的返回值;
 * 如果只想實現一組語句的正確執行,而不關心其返回值,可以使用do while;
 * 但是如果想獲取這組語句的返回值,則必須使用()和{},將返回值放在最後一句。
 */
#define min(x, y)                         \
do {                                      \
    typeof(x) _min1 = (x);                \
    typeof(y) _min2 = (y);                \
    (void) (&_min1 == &_min2);            \
    _min1 < _min2 ? _min1 : _min2;        \
} while (0)

int main ()
{
    min(10, 30);
    return 0;
}


------------------------------------------------------
#include <stdio.h>

int main ()
{
    int  i;
    char j;
    /* 
     * 通過下面測試證明,取址操作獲取的地址是有類型的 
     * &i 獲取的地址類型爲 int  *
     * &j 獲取的地址類型爲 char *
     */
    printf("&i   = %p\n", &i);
    printf("&i+1 = %p\n", &i+1);
    printf("&j   = %p\n", &j);
    printf("&j+1 = %p\n", &j+1);

    (void)(&i == &j);
    return 0;
}

$ gcc test.c
test.c: 在函數‘main’中:
test.c:17: 警告: 比較不相關的指針時缺少類型轉換
$ ./a.out 
&i   = 0xbfeccbac
&i+1 = 0xbfeccbb0
&j   = 0xbfeccbb3
&j+1 = 0xbfeccbb4


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章