#define isnan(x) \
__extension__({ __typeof (x) __x_a = (x); \
__builtin_expect(__x_a != __x_a, 0); })
在看redis源碼的時候發現了一個有趣的東西,這個宏對是否是有效的實數進行了判斷。
這個宏裏面有很多知識點:
__extension__
gcc對標準C語言進行了擴展,但用到這些擴展功能時,編譯器會提出警告,使用__extension__關鍵字會告訴gcc不要提出警告。gcc選項-ansi指示編譯器編譯符合標準的程序,但是不限制其它方式,只要它與標準不衝突。這樣,asm、typeof、inline都將無效,但是__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;
}
看了結果是否會恍然大悟?