带isnan宏的C if语句括号
在C语言中,我曾经能够在带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!"); } } 什么编译器标志允许
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))