Почему следующий код не генерирует предупреждение в MSVC - PullRequest
6 голосов
/ 05 марта 2010

У меня есть фрагмент кода, который можно обобщить следующим образом:

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

Я бы подумал, что простое обращение к переменной, без ее изменения в любом случае или использование ее значения в любом случае должно генерировать предупреждение. В VS2003 это не так, и мне нужно что-нибудь, чтобы поднять его.

Я понимаю, что это не влияет на выполнение, но так как это кусок кода, который ничего не делает, и программист, несомненно, намеревался что-то сделать, почему он не помечен?

Точно так же вы ожидаете, что x = x будет предупреждением?

Редактировать: Измененный вопрос, поскольку он является хорошим кандидатом для предупреждения, но не является ошибкой. Ответы показывают, что это лучше обрабатывается другими компиляторами. Попробую VS2008 позже и опубликую результат.

Ответы [ 4 ]

1 голос
/ 05 марта 2010

Вам нужно использовать лучший компилятор :-) Скомпилированный с флагами -Wall и -pedantic, компилятор GCC C ++ имеет следующий код:

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

производит эту диагностику:

ma.cpp:3: warning: statement has no effect
1 голос
/ 05 марта 2010

Вы ожидаете предупреждения, если не примете выражение void, т.е.

void MyFunc()
{
   int x;

   (void)x;  

}

Какой уровень предупреждения вы установили?

1 голос
/ 05 марта 2010

Такой код может встречаться в шаблонном классе для целей метапрограммирования. Например, это может быть какая-то проверка, доступна ли x из текущего контекста. Да, это не влияет на результат выполнения , но влияет на результат компиляции ; это может помочь таким методам, как SFINAE .

Кажется, что компиляция тоже не поможет. Тела Funciton не учитываются при выборе правильного шаблона для вызова функции. И чтобы проверить доступность в области видимости класса, вы должны использовать оператор using для зависимых имен; этот using оператор сам по себе является проверкой доступности.

Итак, код x; действительно не действует.

0 голосов
/ 05 марта 2010

Оба оператора с одной переменной (например, x; ) и самоопределение (например, x = x ) являются допустимым кодом в C ++, поэтому компилятор не может помечать они как ошибки, но хороший компилятор, конечно, может предупреждать, что они не имеют никакого эффекта и могут быть ошибками программиста. Например, компилятор g ++ выдает предупреждение «оператор не имеет никакого эффекта» для x; .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...