带isnan宏的C if语句括号

带isnan宏的C if语句括号,c,gcc,macros,C,Gcc,Macros,在C语言中,我曾经能够在if条件中使用isnan宏而不使用括号,如下所示: #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!"); } } 什么编译器标志允许

在C语言中,我曾经能够在
if
条件中使用
isnan
宏而不使用括号,如下所示:

#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!");
    }
}

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

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

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

 #define isnan(_x) (__builtin_isnan(_x))
这会产生一个副作用,允许你的行为

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


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

否,编译器不会允许您省略
if
语句周围的圆括号,尽管它们可以由(预处理器)宏提供。您的代码在MSVC中运行良好,其中(请参阅下一条注释)
isnan
仅在C中是一个宏。在某些版本中,isnan被定义为宏,而在其他版本中则被定义为函数。在c99中,它是一个宏,因此省略括号可能有效,因为它应该被括起来(如@WeatherVane的示例)。也许
-std=c99
会起作用。参考@A.S.H的评论,我编辑了我之前的一篇评论,它说:这可能取决于你如何实现它。在MSVC中,我可以定义测试(x)(a==x)
,然后定义int a=1;如果测试(1)printf(“是”\n)并且不需要括号。谢谢。出于好奇,我如何找到
isnan
的定义?请查看编译器附带的标题
。它可能是编译器使用的include路径中名为
math.h
的文件。对于gcc,请参阅。如果该文件中有
#include
指令,请查看命名文件。。。。注意:我强烈建议不要编辑标准头文件,因为它们可能会在编译器/库更新时被覆盖。谢谢@Peter。文件
/usr/include/math.h
定义了
isnan
,与您在回答中描述的非常相似。
 #define isnan(_x) (__builtin_isnan(_x))