假设我有这样的代码:
#if defined(SOMEDEF) && SOMEDEF >= 5
// ...
#endif
基本上,SOMEDEF
可能未定义,但在运算符&&
的抑制分支中使用。 GCC接受此代码,但根据标准是否合法?所有编译器都支持这个吗?
答案 0 :(得分:6)
严格来说,这取决于。
#if defined(SOMEDEF) && SOMEDEF >= 5
如果满足下列条件之一,则合法:
SOMEDEF
已定义,和 SOMEDEF
的宏扩展是以上是有效的表达式。SOMEDEF
未已定义。在这种情况下,SOMEDEF >= 5
仍然是有效的表达式。请注意,在宏替换(和defined
运算符评估)之后,未定义的任何标识符(true
/ false
除外)都将替换为0
; 0 >= 5
是一个有效的子表达式。例如,不有效:
#define SOMEDEF 0(0)
#if defined(SOMEDEF) && SOMEDEF >= 5
...因为0(0) >= 5
不是有效的子表达式。
,`#if defined(__ has_cpp_attribute)&& __has_cpp_attribute(不建议使用)`不工作
你的意思是说,当__has_cpp_attribute
未定义时,这不起作用。在这种情况下也会发生同样的事情; 0(0)
不是有效的子表达式。
答案 1 :(得分:4)
是的,您在问题中的代码是有效的。事实上,您甚至不需要检查是否定义了SOMEDEF
。如果不是,则假定为0。所以,这在功能上是等价的:
#if SOMEDEF >= 5
// ...
#endif
答案 2 :(得分:0)
是的,这种语法完全有效。如果SOMEDEF
定义的SOMEDEF >= 5
将仅展开$('.number').keypress(function(event) {
var $this = $(this);
if ((event.which != 46 || $this.val().indexOf('.') != -1) &&
((event.which < 48 || event.which > 57) &&
(event.which != 0 && event.which != 8))) {
event.preventDefault();
}
var text = $(this).val();
if ((event.which == 46) && (text.indexOf('.') == -1)) {
setTimeout(function() {
if ($this.val().substring($this.val().indexOf('.')).length > 3) {
$this.val($this.val().substring(0, $this.val().indexOf('.') + 3));
}
}, 1);
}
if ((text.indexOf('.') != -1) &&
(text.substring(text.indexOf('.')).length > 1) &&
(event.which != 0 && event.which != 8) &&
($(this)[0].selectionStart >= text.length - 1)) {
event.preventDefault();
}
});
$('.number').bind("paste", function(e) {
var text = e.originalEvent.clipboardData.getData('Text');
if ($.isNumeric(text)) {
if ((text.substring(text.indexOf('.')).length > 3) && (text.indexOf('.') > -1)) {
e.preventDefault();
$(this).val(text.substring(0, text.indexOf('.') + 3));
}
}
else {
e.preventDefault();
}
});
,则其他块将不会展开。