在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 ++,我从未在我使用的任何其他编译器上遇到过这样的警告消息。是否有一些合理的解释为什么这个警告会有所帮助,例如,是否存在此警告可能表明编程错误的特定情况?
答案 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)