#if defined(token)&& token == ... - 这种语法合法吗?

时间:2017-09-15 05:29:44

标签: c++ c-preprocessor

假设我有这样的代码:

#if defined(SOMEDEF) && SOMEDEF >= 5
  // ...
#endif

基本上,SOMEDEF可能未定义,但在运算符&&的抑制分支中使用。 GCC接受此代码,但根据标准是否合法?所有编译器都支持这个吗?

3 个答案:

答案 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(); } }); ,则其他块将不会展开。