在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
条件下省略括号?
答案 0 :(得分:1)
没有编译器标志允许这样做。
您的实现中的编译器(或者更可能是头文件)可能将isnan()
定义为括号中的宏,例如
#define isnan(_x) (__builtin_isnan(_x))
这会产生允许您使用行为的副作用。
但是,isnan()
的定义是实现定义的,因此(除其他外)不需要是括在括号中的宏。
实际上,将if isnan(x)
与if (isnan(x))
的所有用法放在一起会更好。这将保证您的代码正常工作,即使您的编译器或标准库已更新,或者您的代码已移植到另一个(C99或更高版本)编译器。