GHS C ++:额外的分号诊断消息 - 目的?

时间:2015-05-19 13:52:39

标签: c++ greenhills

GHS编译器中,如果连续多个分号没有任何插入语句,则会生成诊断消息(警告)。例如:

void myfunc()
{
}; // warning #381-D: extra ';' ignored.

这似乎不是一种非常常见的情况,但是在预处理发生后也会发出此警告,这样,以下内容也会生成警告(在发布时编译):

#if _DEBUG
  #define DEBUG_VAR(x) x
#else
  #define DEBUG_VAR(x) 
#endif

void myfunc()
{
}
// global variable, used only in debug
DEBUG_VAR(int x); // warning #381-D: extra ';' ignored.

我意识到在这种情况下有很简单的方法可以解决这个问题,它只是一个说明性的例子。预处理器还有许多其他情况,您最终可能会得到类似的结构。

显然,代码是合法的c ++,我从未在我使用的任何其他编译器上遇到过这样的警告消息。是否有一些合理的解释为什么这个警告会有所帮助,例如,是否存在此警告可能表明编程错误的特定情况?

2 个答案:

答案 0 :(得分:0)

我最喜欢的例子是“持久的分号”。我在上一个工作地点有一个。他写了两遍以上:

  $('#more').hover(
    function(){
      var $this = $('#text');
      $this.data('transform', $this.css('transform')).css('transform', 'scale(1.05)');
    },
    function(){
      var $this = $('#text');
      $this.css('transform', $this.data('transform'));
    }
  );  

...然后被阻止他的阵列没有被初始化。 更糟 ,他有一个随机变量被破坏的错误。

如果您无法发现它,编译器会不会很好?

说完所有这些之后,我会同意通常一个流浪的分号是“驯服的” - 但是让编译器在一个地方吐出错误的逻辑在其他地方没有区别......

答案 1 :(得分:-3)

  

是否有一些合理的解释为什么这个警告会有所帮助,例如,是否存在此警告可能表示编程错误的特定情况?

大多数情况下,当然?

由于;没有任何意义,要么你把它写成冗余(然后你要问"为什么?")或者 - 这就是关键 - 你写了它意外地删除之前的一些代码,或者通过让其他错误使得解析器混淆并使; 看起来像这样,实际上它并不是多余的。

但是,我不能想到一个例子。

但是那个宏会更好地写成:

#include <type_traits>
#ifndef NDEBUG
   #define DEBUG_VAR(T, N) std::common_type<T>::type N;
#else
   #define DEBUG_VAR(T, N)
#endif

void myfunc()
{}

// global variable, used only in debug
DEBUG_VAR(int, x)