带有isnan宏的C if语句括号

时间:2016-12-12 23:48:54

标签: c gcc macros

在C中,我曾经能够在isnan条件下使用没有括号的if宏,如下所示:

#include <math.h>
#include <stdio.h>
void main() {
    float x,y,z;
    x=0; y=0; z=x/y;  
    if isnan(z) {            // <--- no parens around isnan
        printf("z isnan!");
    }
}

使用gcc 5.2.1-22ubuntu2在Ubuntu 15.10上编译。

然而,在使用gcc 4.7.4-3ubuntu12的Ubuntu 16.04.1 LTS上,我得到了这个gcc编译器错误:

error: expected '(' before '__builtin_isnan'

什么编译器标志允许我在if条件下省略括号?

1 个答案:

答案 0 :(得分:1)

没有编译器标志允许这样做。

您的实现中的编译器(或者更可能是头文件)可能将isnan()定义为括号中的宏,例如

 #define isnan(_x) (__builtin_isnan(_x))

这会产生允许您使用行为的副作用。

但是,isnan()的定义是实现定义的,因此(除其他外)不需要是括在括号中的宏。

实际上,将if isnan(x)if (isnan(x))的所有用法放在一起会更好。这将保证您的代码正常工作,即使您的编译器或标准库已更新,或者您的代码已移植到另一个(C99或更高版本)编译器。