【发布时间】:2015-07-31 09:39:46
【问题描述】:
在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++,我从未在我使用过的任何其他编译器上遇到过这样的警告消息。是否有一些合理的解释说明为什么此警告会有所帮助,例如,是否存在此警告可能指示编程错误的特定情况?
【问题讨论】:
-
GCC's always done it as far as I can remember。也许您一直没有指定警告开关? :)
-
@LightnessRacesinOrbit 也许我只是在使用 gcc 编译时没有使用 -pendantic。我没有向 GHS 指定这一点,它通常会发出警告。
-
“显然,代码是合法的 c++” - 这既不明显也不真实。在添加“空声明”产生的 C++11 之前,函数外部的杂散分号实际上在技术上是非法的,尽管我听说过的所有编译器都接受它作为扩展。
-
@SebastianRedl - 查看 C++03 规范 - 似乎说空语句是合法的:6.2 表达式语句 1 表达式语句的形式为 expression-statement: expressionopt ;计算表达式并丢弃其值。左值到右值 (4.1)、数组到指针 (4.2) 和函数到指针 (4.3) 标准转换不适用于表达式。表达式语句的所有副作用都在执行下一条语句之前完成。缺少表达式的表达式语句称为空语句。
-
@MuertoExcobito 声明!= 声明。语句出现在函数体中,所以有杂散的分号是合法的。在文件(或命名空间或类)级别,编译器仅查找声明。
标签: c++ greenhills