为什么以下代码不会在MSVC中生成警告

时间:2010-03-05 09:36:21

标签: c++ compiler-warnings

我有一段代码可以总结如下;

void MyFunc()
{
   int x;
'
'
   x;  
'
'
}

我原本以为只是引用一个变量,无论如何都不修改它或者无论如何都要使用它的值应该产生一个警告。在VS2003中,它既没有,也不需要lint来拾取它。

我意识到它不会影响执行,但由于它是一段什么都不做的代码,程序员无疑打算做某事,为什么它没有被标记?

同样,您希望 x = x 成为警告吗?

修改:修改后的问题,因为这构成了警告的良好候选人,但不是错误。回复表明,其他编译器可以更好地处理这个问题。稍后会试用VS2008并发布结果。

4 个答案:

答案 0 :(得分:1)

此类代码可能出现在模板类中,用于元编程目的。例如,可能会检查是否可以从当前上下文访问x是的,它不会影响执行的结果,但它会影响编译的结果;这可能有助于SFINAE等技术。

看来,编译也无济于事。函数体不计入为函数调用选择适当的模板。要检查类范围内的可访问性,必须使用using运算符作为从属名称;这个using运算符本身就是一个辅助功能检查。

因此,代码x;确实无效。

答案 1 :(得分:1)

除非你将表达式转换为void,否则你会发出警告,即

void MyFunc()
{
   int x;

   (void)x;  

}

您设置了什么警告级别?

答案 2 :(得分:1)

你需要使用更好的编译器:-)使用-Wall和-pedantic标志编译,GCC C ++编译器给出了这段代码:

int main() {
    int x = 0;
    x;
}

生成此诊断:

ma.cpp:3: warning: statement has no effect

答案 3 :(得分:0)

单变量语句(例如 x; )和自我赋值(例如 x = x )都是C ++中的有效代码,因此编译器可以' t将它们标记为错误,但是一个好的编译器当然可以发出警告,它们没有任何效果,并且可能是程序员的错误。例如,编译器g ++为 x; 提供警告“语句无效”。