Почему следующее кодирует не, генерируют предупреждение в MSVC

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

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

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

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

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

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

6
задан SmacL 5 March 2010 в 11:15
поделиться

4 ответа

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

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

выдает эту диагностику:

ma.cpp:3: warning: statement has no effect
1
ответ дан 17 December 2019 в 18:14
поделиться

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

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

Таким образом, код x; на самом деле не имеет никакого эффекта.

1
ответ дан 17 December 2019 в 18:14
поделиться

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

void MyFunc()
{
   int x;

   (void)x;  

}

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

1
ответ дан 17 December 2019 в 18:14
поделиться

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

0
ответ дан 17 December 2019 в 18:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: