У меня есть раздел кода, который может быть получен в итоге следующим образом;
void MyFunc()
{
int x;
'
'
x;
'
'
}
Я думал бы, что, просто ссылаясь на переменную, не изменяя это в так или иначе или использование ее значения в так или иначе должно генерировать предупреждение. В VS2003 это не делает ни одного, и это мне нужен линт для собирания его.
Я понимаю, что это не производит выполнение, но так как это - часть кода, который ничего не делает, и программист, несомненно, намеревался сделать что-то, почему это не отмечается?
Так же Вы ожидали бы, что x = x будет предупреждением?
Править: Измененный вопрос, поскольку это составляет хорошего кандидата на предупреждение, но не является ошибкой. Ответы предполагают, что это обрабатывается лучше с другими компиляторами. Испытает VS2008 позже и отправит результат.
. Вам нужен лучший компилятор :-) Скомпилированный с -Wall и -pedantic флаги, компилятор GCC C ++ с таким кодом:
int main() {
int x = 0;
x;
}
выдает эту диагностику:
ma.cpp:3: warning: statement has no effect
Такой код может находиться в шаблонном классе для целей метапрограммирования. Например, это может быть какая-то проверка, доступен ли x
из текущего контекста. Да, это не влияет на результат выполнения, но влияет на результат компиляции; это может быть полезно для таких техник, как SFINAE.
Похоже, что и для компиляции это не помогает. Тела функций не учитываются при выборе подходящего шаблона для вызова функции. А чтобы проверить доступность в области видимости класса, нужно использовать оператор using
для зависимых имен; этот оператор using
сам по себе является проверкой доступности.
Таким образом, код x;
на самом деле не имеет никакого эффекта.
Вы бы ожидали предупреждения, если бы не привели выражение к void, т.е.
void MyFunc()
{
int x;
(void)x;
}
Какой уровень предупреждения у вас установлен?
Оба оператора с одной переменной (например, x; ) и самоназначение (например, x = x ) являются допустимым кодом в C ++, поэтому компилятор не может пометить их как ошибки, но хороший компилятор, конечно, может выдать предупреждение, что они не Не имеют никакого эффекта и могут быть ошибками программиста. Например, компилятор g ++ выдает предупреждение «инструкция не действует» для x; .