__x_a != __x_a什麼時候不成立?

#define isnan(x) \

    __extension__({ __typeof (x) __x_a = (x); \                                                                                                                                

    __builtin_expect(__x_a != __x_a, 0); })

 

在看redis源碼的時候發現了一個有趣的東西,這個宏對是否是有效的實數進行了判斷。

這個宏裏面有很多知識點:

__extension__

gcc對標準C語言進行了擴展,但用到這些擴展功能時,編譯器會提出警告,使用__extension__關鍵字會告訴gcc不要提出警告。gcc選項-ansi指示編譯器編譯符合標準的程序,但是不限制其它方式,只要它與標準不衝突。這樣,asmtypeofinline都將無效,但是__asm____typeof____inline__還將有效。經常與-ansi一起使用的是-pedantic選項,它嚴格按照ISO標準產生需要的警告信息,但是如果程序中使用了__extension__,則-pedantic選項對__extension__後的表達式無影響。如果要非常嚴格,可以使用-pedantic-errors選項。這樣,所有與標準不符和的代碼統統被編譯器當成是錯誤而不是警告。

 

__typeof(param/type) 取param的類型或者type的類型

 

__builtin_expect expr較大機率爲1還是爲0

 

硬菜來了,啥時候__x_a != __x_a?

看起來很non-sense吧?不可能,絕逼不可能!?一個數會不等於另外一個數?

但是,請看如下的程序:

#include<stdio.h>

#include<math.h>

int main()

{                                                                                                                                                                        

    doublea = sqrt(-1.0);

    doubleb = 1.0;

   printf("%f %d\n%f %d\n", a, a==a, b, b==b);

    return0;

}

 

看了結果是否會恍然大悟?

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