Существуют ли случаи из реальной жизни, когда предупреждение C4930 Visual C ++ не указывает на ошибку? - PullRequest
9 голосов
/ 22 марта 2011

Visual C ++ может выдавать C4930 «прототип неиспользуемой функции» в следующем случае:

void SomeUsefulFunction()
{
    SomeResourceLock lock(); //C4930 - unused function prototype
    //code requiring the above lock
}

в приведенном выше коде предполагалось создать выделенный из стека объект RAII:

void SomeUsefulFunction()
{
    SomeResourceLock lock; //okay
    //code requiring the above lock
}

но поскольку круглые скобки были напечатаны, определение переменной превратилось в прототип функции, поэтому объект RAII не создается, и нет объекта «блокировки», и поведение кода не изменяется.

Также предупреждение выдается только тогда, когда неиспользованный прототип находится внутри функции, а не на уровне класса. Кажется довольно бесполезным иметь прототип функции внутри функции , а не вызывать функцию-прототип.

Теперь я испытываю желание использовать pragma warning, чтобы Visual C ++ воспринимал это предупреждение как ошибку.

Существуют ли случаи из реальной жизни, когда C4930 не сопровождается ошибкой?

Ответы [ 4 ]

2 голосов
/ 23 марта 2011

C ++ делает законным создание локальных объявлений функций, хотя я редко видел, чтобы эта функция использовалась.Часто это ошибка, но, например, если вы действительно использовали такое объявление и вызвали соответствующую функцию:

int main()
{
    int foo();
    return foo();
}

А затем удалили вызов функции:

int main()
{
    int foo();
    return 0;
}

Было бы глупо, если бы вдруг он больше не компилировался.

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

Дело в том, что создатели компилятора не могут сделать это ошибкой, потому что это синтаксически допустимо.Если вы хотите рассматривать это как ошибку в своем коде, это, вероятно, не вызовет у вас никаких проблем.

2 голосов
/ 22 марта 2011

По вашей собственной ссылке

C4930 также может происходить, когда компилятор не может различить объявление прототипа функции и вызов функции.

Конечно, это само по себевероятно, не является достаточной причиной, чтобы не рассматривать это предупреждение как ошибку.Если компилятор в замешательстве, кто-то читает код, возможно, тоже, и, вероятно, его все равно следует сделать менее двусмысленным.

2 голосов
/ 22 марта 2011

Честно говоря, я компилирую "обрабатывать предупреждения как ошибки", все предупреждения, и я думаю, что это правильное решение.Хотя при первом включении этой функции вы потратите некоторое время на исправление всех предупреждений до того, как сборка будет очищена, оттуда на дополнительные расходы по очистке добавляется любое введенное предупреждение, и они действительно обнаруживают некоторые ошибки.

Что касается того, может ли предупреждение не быть ошибкой в ​​любом случае, конечно.Для этого конкретного предупреждения представьте, что вы объявили функцию в пространстве имен и использовали ее, а позже при некотором рефакторинге вашего кода эта функция больше не нужна.Если вы удалите вызов, компилятор вызовет это предупреждение, и в этом конкретном случае ничего не сломается.Тем не менее, как я уже сказал, я удалил бы объявление для сборки без предупреждений.

0 голосов
/ 22 марта 2011
void UnusedFunctionPrototype();
...